我在一个名为parent的插件中进行了项目范围的设置,该插件尝试应用maven-publish插件,然后以编程方式配置发布扩展。这似乎有效,但是当我在 build.gradle 脚本中应用此插件时,我无法配置发布扩展来设置项目特定的发布。
我收到错误:
Cannot configure the 'publishing' extension after it has been accessed.
我的目的是在父插件中设置发布存储库,然后让每个 build.gradle 脚本添加适当的发布。
有办法做到这一点吗?
当前 ParentPlugin.groovy 看起来像:
def void apply(Project project) {
project.getProject().apply plugin: 'maven-publish'
def publishingExtension = project.extensions.findByName('publishing')
publishingExtension.with {
repositories {
maven {
mavenLocal()
credentials {
username getPropertyWithDefault(project.getProject(), 'publishUserName', 'dummy')
password getPropertyWithDefault(project.getProject(), 'publishPassword', 'dummy')
}
}
}
}
}
我的客户端 build.gradle 在尝试配置发布扩展时失败。
apply plugin: 'parent'
publishing {
publications {
mavenJava(MavenPublication) {
groupId 'agroup'
artifactId 'anartifactid'
version '1.0.0-SNAPSHOT'
from components.java
}
}
}
这可能吗?我应该有其他方法来解决这个问题吗?
最佳答案
有关插件 maven-publish 的存储库和出版物的注意事项:
主题:如何解决这个令人困惑的 gradle fatal error 消息: 访问“发布”扩展后无法对其进行配置
首先要尝试的事情(深层魔法): (注意“project.”前缀是可选的) -- 配置发布和存储库不如下所示:
project.publishing {publications {...}}
project.publishing {repositories {...}}
但是喜欢这个推荐的风格:
project.publishing.publications {...}
project.publishing.repositories {...}
对于 gradle 专家来说,解释这个技巧为何有效会很有启发性。
另一个已知的解决方法是确保每个插件的应用 maven-publish 与以下项目位于同一项目代码块中 项目.发布.存储库和项目.发布.出版物。 但这比第一个尝试更复杂、更难做, 因为默认情况下 CBF 应用 maven-publish 并对其进行第二次应用 本身可能会导致相同的错误。 maven-publish 通常应用在 pub/scripts/publish-maven.gradle 中, 除非 PUB_PUBLISH_MAVEN 设置为覆盖该文件位置, 在这种情况下,调用者应该应用插件 maven-publish。 请参阅https://orareview.us.oracle.com/29516818为什么这不是优选的 可以在仍然使用 CBF 的同时完成解决方法(对于项目 emcapms)。
附注有一天我会用最少的代码示例来写这个。但我现在将这一来之不易的知识放在那里,以避免其他人在这个常见的 Maven 发布问题上浪费时间。
关于gradle - 插件如何以编程方式配置maven-publish发布并允许build.gradle修改它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21190230/