在插件发布期间排除文件和文件夹
Excluding files and folders during plugin publishing
我想在将插件发布到我们的自定义 Artifactory 存储库时排除 .svn
个文件夹。我假设包含 .svn
文件夹是基于下面提供的错误跟踪的问题。
我正在使用以下命令发布:
gradlew artifactoryPublish --stacktrace
这是build.gradle
中的发布区块:
artifactory {
contextUrl = artifactory_context
publish {
repository {
repoKey = 'plugins-release-local'
username = artifactory_user
password = artifactory_password
maven = true
}
defaults {
publications ('mavenJava')
}
}
}
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
}
}
}
这是我尝试发布时得到的堆栈跟踪,请注意 .svn/entries
到 assets/entries
的尝试副本。
...
:copyAssets FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':copyAssets'.
> Could not copy file '/u01/var/build/pluginXYZ/grails-app/assets/.svn/entries' to '/u01/var/build/pluginXYZ/build/resources/main/META-INF/assets/entries'.
* Try:
Run with --info or --debug option to get more log output.
* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':copyAssets'.
...
Caused by: org.gradle.api.GradleException: Could not copy file '/u01/var/build/pluginXYZ/grails-app/assets/.svn/entries' to '/u01/var/build/pluginXYZ/build/resources/main/META-INF/assets/entries'.
...
Caused by: java.io.FileNotFoundException: /u01/var/build/pluginXYZ/build/resources/main/META-INF/assets/entries (Permission denied)
... 80 more
entries
(两棵树)的权限为 -r--r--r--
。
如果我排除那些文件夹,我应该摆脱上述权限问题。第一次签出将始终发布,但后续发布(比如更新后)会失败并出现此错误。
更新#2
以下是我试过的三个组合都没有成功:
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
//first attempt
//exclude("**/.svn/**")
//second attempt
//exclude{ details -> details.file.name.contains(".svn") }
//third attempt
//exclude "**/.svn/**"
}
}
}
使用所有三种尝试进行发布时的错误输出如下:
Caused by: org.gradle.api.internal.MissingMethodException: Could not find method exclude() for arguments [build_3nsvrqvwahy23ir3fxdj970id$_run_closure7_closure13_closure14_closure15@10e9a5fe] on org.gradlpublish.maven.internal.publication.DefaultMavenPublication_Decorated@ca7e37f.
更新#3
我找到了以下 link taking about excluding files.
然后我将 gradle.build
调整为:
publishing {
publications {
mavenJava(MavenPublication) {
from components.java {
exclude "**/.svn/**"
}
}
}
}
同样的错误。
更新 #4
更多尝试...相同的结果
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
artifact sourceJar{
exclude '**/.svn/**'
}
}
}
}
或
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
artifact exclude '**/.svn/**'
}
}
}
我认为您可以将 'exclude' 方法与文件过滤器一起使用。只需将其添加到发布块中的 'from' 下即可。
我在 build.gradle
的根级别附加了以下内容,它似乎有效:
sourceSets {
main {
java {
exclude '**/.svn/**'
}
}
}
比如说,您有一个文件希望在发布到存储库时 仅 避免。如果您按照@TekiusFanatikus 的建议进行
sourceSets {
main {
java {
exclude '**/.svn/**'
}
}
}
你将能够实现它,但这也会从你使用 gradle build.[ 生成的工件中排除 file/folder 等。 =14=]
相反,我建议使用这里提到的方法 gradle documnetation
您可以创建应用了所需排除项的任务
task apiJar(type: Jar) {
baseName "publishing-api"
from sourceSets.main.output
exclude '**/.svn/**'
}
然后在发布时引用任务。
publishing {
publications {
api(MavenPublication) {
groupId 'org.gradle.sample'
artifactId 'project2-api'
version '2'
artifact apiJar
}
}
}
这样发布出来的jar就没有.svn文件夹了。我想在这里强调的一点是,它不会触及使用 gradle build 创建的工件。它仍然会有你的 .svn 文件夹。
但是如果你想把它从两个地方都删除,那么最好的选择就是上面的建议。
我想扩展@Neeraj 的回答。自定义 JAR 方法的问题在于它不会生成有效的 POM——尤其是在多模块项目的情况下——不像 from components.java
方法可以正确生成 POM。
为了克服这个问题,我们可以声明两个发布 - 一个内部仅用于生成 POM,第二个是我们希望发布的实际发布(没有排除的文件):
task apiJar(type: Jar) {
baseName "publishing-api"
from sourceSets.main.output
exclude '**/.svn/**'
}
publishing {
publications {
def pomString = null
internal(MavenPublication) {
from components.java
pom.withXml {
pomString = asString().toString()
}
}
api(MavenPublication) {
artifact apiJar
pom.withXml {
def builder = asString()
builder.delete(0, builder.length())
builder.append(pomString)
}
}
}
}
generatePomFileForApiPublication.dependsOn(generatePomFileForInternalPublication)
artifactoryPublish {
publications('api')
}
请注意,generatePomFileForXPublication
任务的名称是根据出版物的名称确定的。
旧答案
这是我之前尝试手动生成 POM 的尝试,但它远不如上面较新的答案那么完整。
task apiJar(type: Jar) {
baseName "publishing-api"
from sourceSets.main.output
exclude '**/.svn/**'
}
publishing {
publications {
api(MavenPublication) {
artifact apiJar
pom.withXml {
def dependenciesNode = asNode().appendNode("dependencies")
project.configurations.runtimeClasspath.resolvedConfiguration.firstLevelModuleDependencies.forEach { d ->
def dependencyNode = dependenciesNode.appendNode("dependency")
dependencyNode.appendNode("groupId", d.moduleGroup)
dependencyNode.appendNode("artifactId", d.moduleName)
dependencyNode.appendNode("version", d.moduleVersion)
}
}
}
}
}
artifactoryPublish {
publications('api')
}
我想在将插件发布到我们的自定义 Artifactory 存储库时排除 .svn
个文件夹。我假设包含 .svn
文件夹是基于下面提供的错误跟踪的问题。
我正在使用以下命令发布:
gradlew artifactoryPublish --stacktrace
这是build.gradle
中的发布区块:
artifactory {
contextUrl = artifactory_context
publish {
repository {
repoKey = 'plugins-release-local'
username = artifactory_user
password = artifactory_password
maven = true
}
defaults {
publications ('mavenJava')
}
}
}
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
}
}
}
这是我尝试发布时得到的堆栈跟踪,请注意 .svn/entries
到 assets/entries
的尝试副本。
...
:copyAssets FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':copyAssets'.
> Could not copy file '/u01/var/build/pluginXYZ/grails-app/assets/.svn/entries' to '/u01/var/build/pluginXYZ/build/resources/main/META-INF/assets/entries'.
* Try:
Run with --info or --debug option to get more log output.
* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':copyAssets'.
...
Caused by: org.gradle.api.GradleException: Could not copy file '/u01/var/build/pluginXYZ/grails-app/assets/.svn/entries' to '/u01/var/build/pluginXYZ/build/resources/main/META-INF/assets/entries'.
...
Caused by: java.io.FileNotFoundException: /u01/var/build/pluginXYZ/build/resources/main/META-INF/assets/entries (Permission denied)
... 80 more
entries
(两棵树)的权限为 -r--r--r--
。
如果我排除那些文件夹,我应该摆脱上述权限问题。第一次签出将始终发布,但后续发布(比如更新后)会失败并出现此错误。
更新#2
以下是我试过的三个组合都没有成功:
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
//first attempt
//exclude("**/.svn/**")
//second attempt
//exclude{ details -> details.file.name.contains(".svn") }
//third attempt
//exclude "**/.svn/**"
}
}
}
使用所有三种尝试进行发布时的错误输出如下:
Caused by: org.gradle.api.internal.MissingMethodException: Could not find method exclude() for arguments [build_3nsvrqvwahy23ir3fxdj970id$_run_closure7_closure13_closure14_closure15@10e9a5fe] on org.gradlpublish.maven.internal.publication.DefaultMavenPublication_Decorated@ca7e37f.
更新#3
我找到了以下 link taking about excluding files.
然后我将 gradle.build
调整为:
publishing {
publications {
mavenJava(MavenPublication) {
from components.java {
exclude "**/.svn/**"
}
}
}
}
同样的错误。
更新 #4
更多尝试...相同的结果
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
artifact sourceJar{
exclude '**/.svn/**'
}
}
}
}
或
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
artifact exclude '**/.svn/**'
}
}
}
我认为您可以将 'exclude' 方法与文件过滤器一起使用。只需将其添加到发布块中的 'from' 下即可。
我在 build.gradle
的根级别附加了以下内容,它似乎有效:
sourceSets {
main {
java {
exclude '**/.svn/**'
}
}
}
比如说,您有一个文件希望在发布到存储库时 仅 避免。如果您按照@TekiusFanatikus 的建议进行
sourceSets {
main {
java {
exclude '**/.svn/**'
}
}
}
你将能够实现它,但这也会从你使用 gradle build.[ 生成的工件中排除 file/folder 等。 =14=]
相反,我建议使用这里提到的方法 gradle documnetation
您可以创建应用了所需排除项的任务
task apiJar(type: Jar) {
baseName "publishing-api"
from sourceSets.main.output
exclude '**/.svn/**'
}
然后在发布时引用任务。
publishing {
publications {
api(MavenPublication) {
groupId 'org.gradle.sample'
artifactId 'project2-api'
version '2'
artifact apiJar
}
}
}
这样发布出来的jar就没有.svn文件夹了。我想在这里强调的一点是,它不会触及使用 gradle build 创建的工件。它仍然会有你的 .svn 文件夹。
但是如果你想把它从两个地方都删除,那么最好的选择就是上面的建议。
我想扩展@Neeraj 的回答。自定义 JAR 方法的问题在于它不会生成有效的 POM——尤其是在多模块项目的情况下——不像 from components.java
方法可以正确生成 POM。
为了克服这个问题,我们可以声明两个发布 - 一个内部仅用于生成 POM,第二个是我们希望发布的实际发布(没有排除的文件):
task apiJar(type: Jar) {
baseName "publishing-api"
from sourceSets.main.output
exclude '**/.svn/**'
}
publishing {
publications {
def pomString = null
internal(MavenPublication) {
from components.java
pom.withXml {
pomString = asString().toString()
}
}
api(MavenPublication) {
artifact apiJar
pom.withXml {
def builder = asString()
builder.delete(0, builder.length())
builder.append(pomString)
}
}
}
}
generatePomFileForApiPublication.dependsOn(generatePomFileForInternalPublication)
artifactoryPublish {
publications('api')
}
请注意,generatePomFileForXPublication
任务的名称是根据出版物的名称确定的。
旧答案
这是我之前尝试手动生成 POM 的尝试,但它远不如上面较新的答案那么完整。
task apiJar(type: Jar) {
baseName "publishing-api"
from sourceSets.main.output
exclude '**/.svn/**'
}
publishing {
publications {
api(MavenPublication) {
artifact apiJar
pom.withXml {
def dependenciesNode = asNode().appendNode("dependencies")
project.configurations.runtimeClasspath.resolvedConfiguration.firstLevelModuleDependencies.forEach { d ->
def dependencyNode = dependenciesNode.appendNode("dependency")
dependencyNode.appendNode("groupId", d.moduleGroup)
dependencyNode.appendNode("artifactId", d.moduleName)
dependencyNode.appendNode("version", d.moduleVersion)
}
}
}
}
}
artifactoryPublish {
publications('api')
}