在插件发布期间排除文件和文件夹

时间:2016-05-11 19:09:02

标签: gradle build.gradle gradlew

我想在将插件发布到自定义Artifactory存储库时排除.svn个文件夹。我假设包含.svn文件夹是基于下面提供的错误strack跟踪的问题。

我正在使用以下命令发布:

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/entriesassets/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

我找到了以下链接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/**'
        }
    }
}

4 个答案:

答案 0 :(得分:1)

假设您在发布到存储库时有一个要避免 ONLY 的文件。如果按照@TekiusFanatikus

的建议去
sourceSets {
  main {
    java {
      exclude '**/.svn/**'
    }
  }
}

您将能够实现它,但这也将从您使用 gradle build 生成的工件中排除文件/文件夹等。

相反,我建议使用此处提到的方法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文件夹。

但是如果你想从两个地方删除它,那么最好的选择如上所述。

答案 1 :(得分:1)

我想扩展@Neeraj的答案。定制JAR方法的问题在于多模块项目,其中POM不包含内部项目依赖项,并且也将缺少外部依赖项(它们仅是依赖项管理部分的一部分)。这与使用from components.java方法相反,在该方法中POM会很好。

为了克服这个问题,需要手动编辑POM文件。这是一个非常肮脏的解决方案,但我唯一能找到的解决方案:

project.afterEvaluate {

    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.runtime.allDependencies.forEach { d ->
                        def dependencyNode = dependenciesNode.appendNode("dependency")
                        dependencyNode.appendNode("groupId", d.group)
                        dependencyNode.appendNode("artifactId", d.name)
                        dependencyNode.appendNode("version", d.version)
                    }
                }

            }
        }
    }

    artifactoryPublish {
        publications('api')
    }
}

更新

对于使用依赖项管理插件io.spring.dependency-management的任何人,这是一种将所有依赖项的版本正确注入POM的方法:

def version = {
    if (d.version != null) d.version
    else dependencyManagement.managedVersions["${d.group}:${d.name}"]
}
dependencyNode.appendNode("version", version())

答案 2 :(得分:0)

我认为你可以在filefilter中使用'exclude'方法。只需将它添加到出版物块中的“from”下即可。

答案 3 :(得分:-1)

我在build.gradle的根级别添加了以下内容,它似乎有效:

sourceSets {
  main {
    java {
      exclude '**/.svn/**'
    }
  }
}