Gradle 不带罐子的玻璃瓶包装纸

Gradle 不带罐子的玻璃瓶包装纸,gradle,gradlew,Gradle,Gradlew,我正在设计一个企业范围的构建系统,到目前为止,大约有21种不同语言的1000多个项目。我们用gradle来做这个,我有个问题。我们正在迁移到gitlab服务器,我们刚刚花了数周时间构建了系统和钩子,这些系统和钩子明确地阻止人们将jar文件和其他库提交到源repo。(说来话长,反正你也不在乎) 现在问题来了 如果gradle/wrapper文件夹中没有jar文件,我们如何使用gradle包装器?我试着删除文件夹,就像git钩子会做的那样,gradlew给了我们一个类notfound错误,正如我所预

我正在设计一个企业范围的构建系统,到目前为止,大约有21种不同语言的1000多个项目。我们用gradle来做这个,我有个问题。我们正在迁移到gitlab服务器,我们刚刚花了数周时间构建了系统和钩子,这些系统和钩子明确地阻止人们将jar文件和其他库提交到源repo。(说来话长,反正你也不在乎)

现在问题来了

如果
gradle/wrapper
文件夹中没有jar文件,我们如何使用gradle包装器?我试着删除文件夹,就像git钩子会做的那样,
gradlew
给了我们一个类notfound错误,正如我所预料的那样


是否可以在不使用jar的情况下使用包装器,或者用户在克隆项目时必须重新生成包装器?如果
gradle/wrapper
文件夹或jar丢失,是否可以将
gradlew
文件设置为自动重新生成?

基本上,当您通过

你说:

  • 剧本
  • 性质
  • gradle包装器jar文件
进入当前项目目录。
gradle wrapper.jar
来自本地的gradle发行版

当您运行
gradle包装器时
可以从该jar调用主类来下载并运行gradle。因此,从技术上讲,您可以修改SH和BASH脚本,以便在Java执行之前从GitHub存储库下载包装文件,显然只有在文件不存在的情况下。我确实做到了,而且很有效,但是我不能确定它有多容易出错。例如,我不知道GitHub将来是否会更改URL。我刚刚在
CLASSPATH=$APP\u HOME/gradle/wrapper/gradle wrapper.jar
行之前的
gradlew.sh
中添加了以下代码片段

if [ ! -f "gradle/wrapper/gradle-wrapper.jar" ]
then
     curl https://raw.githubusercontent.com/gradle/gradle/master/gradle/wrapper/gradle-wrapper.jar -o $APP_HOME/gradle/wrapper/gradle-wrapper.jar
fi

无论如何,包装文件有56K,并且它被设计成尽可能小,以允许人们将其放入Git存储库。话虽如此,我相信您不应该担心它,只要将这个特定的JAR文件添加到您的钩子的白名单中,并允许它进入存储库。
gradlew
脚本依赖于
gradle wrapper.JAR
,因为它只是从JAR中调用gradlerappermain。因此,如果没有JAR,就不能使用包装器脚本。但是,您可以使用“引导”包装器。

谢谢,我将试一试。我们将从我们自己的内部dist服务器进行分发,以便可以正常工作。我也会读一下包装器脚本,也许我可以把它移植到某个地方。出现的另一个想法是克隆钩子,它检测到gradlew文件是否在那里,并在克隆上重新生成它。我会玩的,看看它能做什么。我们专门设计了我们的jar过滤系统,没有白名单,因为他们在这里有一个被滥用的习惯。
URL jarFileSource = Wrapper.class.getResource("/gradle-wrapper.jar");
if (jarFileSource == null) {
    throw new GradleException("Cannot locate wrapper JAR resource.");
}
GFileUtils.copyURLToFile(jarFileSource, jarFileDestination);
if [ ! -f "gradle/wrapper/gradle-wrapper.jar" ]
then
     curl https://raw.githubusercontent.com/gradle/gradle/master/gradle/wrapper/gradle-wrapper.jar -o $APP_HOME/gradle/wrapper/gradle-wrapper.jar
fi