在 gradle 中动态设置存储库和 version/revison

Set repositories and version/revison dynamically in gradle

我有一个 gradle 构建脚本。在这个脚本中我设置了一些发布。

稍后在脚本中我有一个任务,它从文件中读取内部版本号并增加它。比项目的版本将被更改。

现在我的问题是:是否可以在初始化 "Publishing"-PlugIn 后更改 revision/version?如果我不设置新版本,"Publishing"-PlugIn 将抛出 n 个错误。如果我通过编辑描述符来更改版本,插件说,不允许直接编辑描述符。

我还想根据内部版本号更改存储库-url。

有没有人知道解决办法或有同样的问题?

publishing {
    publications {
        ivy(IvyPublication) {
            organisation project.group
            module project.name
            revision project.version
            descriptor.status = 'milestone'

            from components.java

            artifact(sourceJar) {
                type "source"
                conf "runtime"
            }
        }
        maven(MavenPublication) {
            groupId project.group
            artifactId project.name
            version project.version

            from components.java
        }
    }
    repositories {
        ivy {
            // change to point to your repo, e.g. http://my.org/repo
            url "P:/Java/Repo/ivy"
        }
        maven {
            // change to point to your repo, e.g. http://my.org/repo
            url "P:/Java/Repo/maven"
        }
    }
}

这是我用于增加内部版本号的脚本

def incVersion(project) {

    project.versionInced = true

    def versionPropsFile = file("${project.rootDir}/version.properties")

    if (!versionPropsFile.canRead()) {
         versionPropsFile.createNewFile();
    }

    def Properties versionProps = new Properties()

    versionProps.load(new FileInputStream(versionPropsFile))

    if(versionProps['build_version'] == null)
    {
        versionProps['build_version'] = 0;
    }

    def code = versionProps['build_version'].toInteger()+1;

    versionProps['build_version']=code.toString()
    versionProps.store(versionPropsFile.newWriter(), null)

    project.projectInfos.version = project.version + "." + code.toString()
    project.version = project.projectInfos.version

    println "Version: "+project.version 

    return project.version
}

如果我理解得很好,是的,可以动态完成。您可以在 运行 gradle 时通过项目 属性 (-P) 或通过系统 属性 (-D).

它将是:

gradle <some_task> -PsomeVersion=<version>

您需要更改 gradle 脚本以读取 属性,因此:

publishing {
    publications {
        ivy(IvyPublication) {
            revision project.hasProperty('someVersion') ? project.someVersion : '<HERE YOU NEED TO PUT DEFAULT VERSION OR MAYBE THROW EXCEPTION IF EMPTY>'
            //...
        }
    }
}

如果您不检查项目是否有 属性(在项目实例上使用 hasProperty 方法),将抛出 MissingPropertyException