【问题标题】:Versioning Gradle native plugin builds版本控制 Gradle 本机插件构建
【发布时间】:2015-05-11 17:03:58
【问题描述】:

这是我第一次尝试使用Gradle's C plugin 构建的 C 程序:

apply plugin: 'c'

model {
    components {
        derpus(NativeExecutableSpec) {
            sources {
                c(CSourceSet) {
                    source {
                        srcDir "src/derpus/c"
                        include "**/*.c"
                    }
                    exportedHeaders {
                        srcDir "src/derpus/headers"
                    }
                }
            }
        }
    }
}

这会生成一个名为derpus.exe 的可执行文件。如果可能的话,我想version 这些可执行文件(derpus-1.0.0.exederpus-1.0.1.exe 等)。当我将 derpus 闭包更改为 derpus-1.0.0 时,如下所示:

derpus-1.0.0(NativeExecutableSpec) {

然后运行gradle clean build 我得到:

D:\workspace\derp\20150505\derpus>gradlew clean build

FAILURE: Build failed with an exception.

* Where:
Build file 'D:\derpus\build.gradle' line: 6

* What went wrong:
Could not compile build file 'D:\derpus\build.gradle'.
> startup failed:
    build file 'D:\derpus\build.gradle': 6: unexpected tok
    en: 0 @ line 6, column 20.
                    derpus-1.0.0(NativeExecutableSpec) {
                               ^

    1 error

有人知道对这些可执行文件进行版本控制的方法吗?


更新

现在这真的很奇怪!听从 Amnon 的建议,我添加了一个定义 version=1.0.0gradle.properties 文件。然后我将model 闭包修改为:

model {
    components {
        derpus(NativeExecutableSpec) {
            sources {
                c(CSourceSet) {
                    source {
                        srcDir "src/derpus/c"
                        include "**/*.c"
                    }
                    exportedHeaders {
                        srcDir "src/derpus/headers"
                    }
                }
            }

            baseName = "derpus-${version}"
        }
    }
}

这会生成一个名为 derpus-1 的可执行文件(什么?!?!)!

然后我又修改了model

version = "3.4"

model {
    components {
        derpus(NativeExecutableSpec) {
            sources {
                c(CSourceSet) {
                    source {
                        srcDir "src/derpus/c"
                        include "**/*.c"
                    }
                    exportedHeaders {
                        srcDir "src/derpus/headers"
                    }
                }
            }

            baseName = "derpus-${version}"
        }
    }
}

如您所见,这应该覆盖gradle.properties 中设置的版本,但是在运行gradle clean build 之后,它会生成derpus-3

所以我又修改了model

model {
    components {
        derpus(NativeExecutableSpec) {
            sources {
                c(CSourceSet) {
                    source {
                        srcDir "src/derpus/c"
                        include "**/*.c"
                    }
                    exportedHeaders {
                        srcDir "src/derpus/headers"
                    }
                }
            }

            baseName = "derpus-3.4.5"
        }
    }
}

这会产生derpus-3.4!!! 这是怎么回事?!? C 插件中是否存在不支持完整的version 变量的错误?

【问题讨论】:

    标签: java c gradle versioning


    【解决方案1】:

    在上面的示例中,derpus-1.0.0 的问题是破折号字符是减号,这在组件规范名称中是意外的,因此失败。您可以通过用引号括起来 derpus-1.0.0 来克服这个问题。然而,更好的方法是将版本应用于组件规范的baseName 属性,即在derpus 组件定义下添加以下行:

    baseName = "derpus-1.0.0"
    

    baseName = "derpus-$version"
    

    在第二种情况下,版本属性 $version 取自 project 对象。

    更新

    根据smeeb cmets 下面可以应用的另一种解决方法是直接重命名目标二进制文件:

    afterEvaluate {
        RenameNativeBinaries()
    }
    
    def RenameNativeBinaries() {
        binaries.all { b ->
            if (b instanceof SharedLibraryBinarySpec) {
                b.sharedLibraryFile = ReconstructFileName(b.sharedLibraryFile)
            } else if (b instanceof StaticLibraryBinarySpec) {
                b.staticLibraryFile = ReconstructFileName(b.staticLibraryFile)
            } 
        }
    }
    
    def ReconstructFileName(File originalFile) {
        def originalFileName = originalFile.absolutePath
        def filePath = FilenameUtils.getFullPath(originalFileName)
        def baseName = FilenameUtils.getBaseName(originalFileName)
        def extension = FilenameUtils.getExtension(originalFileName)
    
        def newName = "$baseName-$version.$extension"
        def newFile = new File(filePath, newName)
        newFile
    }
    

    其中FilenameUtils 取自commons-io

    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath group: 'commons-io', name: 'commons-io', version: '2.4'
        }
    }
    

    【讨论】:

    • 感谢@Amnon Shochot (+1) - 但是请查看我的更新。似乎 C 插件正在截断 $version(删除尾随 0 和/或补丁号)。有任何想法吗?再次感谢!
    • 我认为这是一个明确的错误 - 如果我将 gradle.properties 中的 version 更改为 4.0.8.0 它会产生 derpus-4.0.8.exe。我可以向谁报告?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 2018-11-03
    相关资源
    最近更新 更多