在Android库项目中指定AAR构件的部署文件名

5

我正在尝试配置一个Android库项目,将多个构件部署到本地托管的Maven仓库。我已经完成了足够的进展,使得两个构件都有自己的POM生成,并且使用以下脚本成功部署到仓库:

android {
    // Publish both debug and release
    publishNonDefault true
}

uploadArchives {
    repositories.mavenDeployer {
        def majorVersion = 1
        def minorVersion = 1
        def buildVersion = project.properties.get('RELEASE', '0').toInteger()

        addFilter('release') { artifact, file ->
            file.name.contains('release')
        }

        addFilter('debug') { artifact, file ->
            file.name.contains('debug')
        }

        activePomFilters.each { filter ->
            pom(filter.name) {
                groupId = 'com.redacted'
                artifactId = 'redacted'
                packaging = 'aar'
                version = "${majorVersion}.${minorVersion}.${buildVersion}"

                if (!project.hasProperty('RELEASE')) {
                    version += "-SNAPSHOT"
                }

                if (filter.name == 'debug') {
                    artifactId += '-debug'
                }
            }
        }
    }
}

预计交货时间为:
com/
    redacted/
        redacted/
            1.1.0-SNAPSHOT/
        redacted-debug/
            1.1.0-SNAPSHOT/

这个问题我的预期内,但是它似乎会添加一个额外的后缀来发布构件(这会破坏依赖项发现),我无法确定它是从哪里生成的或者如何更改它。我看到的是:

com/redacted/redacted/1.1.0-SNAPSHOT/
    redacted-1.1.0-20150717.213849-1-release.aar
    redacted-1.1.0-20150717.213849-1-release.aar.md5
    redacted-1.1.0-20150717.213849-1-release.aar.sha1
    redacted-1.1.0-20150717.213849-1.pom
    redacted-1.1.0-20150717.213849-1.pom.md5
    redacted-1.1.0-20150717.213849-1.pom.sha1

由于某些原因,它仅将日期和“-release”后缀附加到与AAR相关的文件上,但不会附加到POM文件上。如果我手动重命名这些文件,一切都可以正常工作。例如,这是我期望的输出:
com/redacted/redacted/1.1.0-SNAPSHOT/
    redacted-1.1.0-20150717.213849-1.aar
    redacted-1.1.0-20150717.213849-1.aar.md5
    redacted-1.1.0-20150717.213849-1.aar.sha1
    redacted-1.1.0-20150717.213849-1.pom
    redacted-1.1.0-20150717.213849-1.pom.md5
    redacted-1.1.0-20150717.213849-1.pom.sha1

我该如何更改这些文件的传输方式?


回复:“它正在将日期以及-release后缀附加到仅与AAR相关的文件,但不是POM文件”; 您是否也不想包括日期,并且调试版本是否表现出相同的行为? - l'L'l
首先,对于日期我无所谓(发现这是快照版本的uniqueVersion标志导致的)——只要输出一致,我就可以接受任何输出。:) 是的,这也会发生在调试构建中。我正在做更多的日志记录,我相信这是由于在构件上设置了分类器,但我仍在尝试找到任何改变它的方法(因为这些构件是自动生成的)。 - Kevin Coppock
我认为你可以在pom.xml中调整大多数属性或创建一个函数来帮助处理问题;据我所知,在maven-3中不支持uniqueVersion。如果不了解您的构建配置,我会说这些解决方案中的一些可能有帮助,或者可以从中获得一些信息。这些解决方案 - l'L'l
你能检查一下这个吗?https://dev59.com/1nVC5IYBdhLWcg3wfxM8 - Radhakrishna Sharma Gorenta
@RKSharma 不幸的是,这不是关于快照与发布版本之间的问题。我需要将多个构建交付到发布存储库中(其中一个恰好被命名为“debug”,另一个被命名为“release”,但两者都需要被访问)。 - Kevin Coppock
你能否请看一下这个问题,我无法解决它。https://dev59.com/L7Tma4cB1Zd3GeqP5mKS @kcoppock - Pie
1个回答

3
你遇到的问题是这样的(重点在于):
重要提示:启用非默认发布时,Maven发布插件将作为额外包(带有分类器)发布这些附加变量。这意味着这与发布到Maven存储库不兼容。您应该将单个变体发布到存储库或启用所有配置发布以进行项目间依赖项。
请参阅文档:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Library-Publication 你看到的后缀“release”和“debug”是通过启用非默认构件的发布引入的分类器。在build/ivy.xml中的元素用作Maven配置的基础,其中包含这些分类器。
迭代配置中的构件并删除分类器无效。虽然允许设置分类器,但其原始值仍保留。
但是有效的方法是包装原始构件。包装器将始终返回分类器的null值。这确实导致发布和调试构件具有相同的完全限定ID(=名称+分类器),从而导致只发布一个构件。这可以通过为调试构件使用不同的名称来解决:
class UnclassifiedPublishArtifact implements PublishArtifact {

    private PublishArtifact delegatee;
    private boolean isDebugArtifact;

    UnclassifiedPublishArtifact(PublishArtifact delegatee, isDebugArtifact) {
        this.delegatee = delegatee
        this.isDebugArtifact = isDebugArtifact
    }

    @Override
    String getName() {
        return delegatee.name + (isDebugArtifact ? '-debug' : '')
    }

    @Override
    String getExtension() {
        return delegatee.extension
    }

    @Override
    String getType() {
        return delegatee.type
    }

    @Override
    String getClassifier() {
        return null
    }

    @Override
    File getFile() {
        return delegatee.file
    }

    @Override
    Date getDate() {
        return delegatee.date
    }

    @Override
    TaskDependency getBuildDependencies() {
        return delegatee.buildDependencies
    }
}

project.afterEvaluate {
    configurations.each { configuration ->
        def artifacts = configuration.artifacts
        if (!artifacts.isEmpty()) {
            def unclassifiedArtifacts = []
            unclassifiedArtifacts.addAll(artifacts.collect { classifiedArtifact ->
                new UnclassifiedPublishArtifact(classifiedArtifact, classifiedArtifact.classifier == 'debug')
            })
            artifacts.clear()
            artifacts.addAll(unclassifiedArtifacts)
        }
    }
}

我从文档中无法完全理解项目依赖关系的后果,因此您应该检查它们是否仍然有效。


这非常有道理,特别是结合文档中的那一行。我认为这种解决方案适用于命名,但正如您所提到的,会存在一些依赖问题。我最终修改了库以避免发布两个变量(这简化了我的工作,但并没有真正回答原始问题)。我很快就会尝试这个解决方案并看看会发生什么。谢谢您的澄清! - Kevin Coppock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接