Gradle - 我可以在项目依赖项中包含任务的输出

rod*_*ion 5 gradle

我有一个任务,从这些来源(比如项目a)生成java源和一组jar .我想将这些罐子导出到依赖项目(比如项目b).所以这里大致是我现在所拥有的:

//a.gradle

configurations{
  generatedJars
}

task generateJars(type: JavaExec) { 
  //generate jars ... 

  outputs.files += //append generated jars here
} 

dependencies{
  generatedJars generateJars.outputs.files
}


//b.gradle

dependencies{
  project(path: ':a', configuration: 'generatedJars')
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,除了generateJars.outputs.files作为依赖项添加并不告诉gradle generateJars当没有生成jar时它必须运行任务.我已经尝试将任务本身添加为依赖项,希望它的工作方式与将jar/zip任务添加到工件配置时的工作方式相同(例如artifacts{ myJarTask }),但它会抛出错误告诉我我不能这样做.当然,我可以generateJars:b开始评估之前在构建过程中的某个地方注入任务,但这是笨拙和脆弱的,所以我想避免它.

我觉得我应该将生成的jar添加到artifacts{ ... }项目中,但我不确定如何使它们对依赖项目可见.有没有更好的方法来实现这一目标?

依赖项目(项目b)需要设置IntelliJ IDEA模块类路径以指向项目a生成的jar.像这样的东西(伪代码):

//b.gradle

idea{
  module{
    scopes.COMPILE.plus += project(path: ':a', configuration: 'generatedJars').files
  }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经尝试简单地增加一个项目dependecy :ageneratedJars:b,但理念插件只是增加了模块:a作为一个模块依赖,假定它出口其产生的瓶(这可能是一个正确的假设),因此不能将所产生的罐子:b的阶级路径.

任何帮助将不胜感激!

Pet*_*ser 2

首先,您需要单独的配置吗?也就是说,您是否有客户端a不应看到生成的 Jars?如果没有,您可以将生成的 Jars 添加到archives配置中,这将简化事情。

其次,将生成的 Jars 添加到配置中的正确方法是(而不是块dependencies):

artifacts {
    generatedJars generateJars
}
Run Code Online (Sandbox Code Playgroud)

这应该确保generateJars任务在需要时自动运行。

第三,我会省略+=after outputs.files,尽管它可能没有什么区别。您还应该添加必要的输入。

第四,为什么需要JavaExec任务来生成 Jars?您可以将生成的源添加到某些源集并让 Gradle 构建它们吗?

第五,IDEA没有对应Gradle的项目配置依赖的概念。IDEA 模块要么完全依赖于另一个模块,要么根本不依赖。您有两个选择:要么使用模块依赖项并将生成的源作为依赖模块的源文件夹(最好在 Gradle 和 IDEA 构建中),要么将生成的 Jars 作为外部依赖项传递给 IDEA。无论哪种情况,您都应该将任务依赖项添加ideaModule到适当的生成任务中。如果这仍然不能带来令人满意的 IDEA 设置,您可以考虑将 Jars 的生成移至单独的子项目中。