Ros*_*sny 6 gradle gradle-plugin
本文介绍了 Gradle 4.10+ 的一个有趣功能,称为源依赖项:
https://blog.gradle.org/introducing-source-dependency
它允许使用 Git(例如 GitHub)源代码存储库来构建依赖项。然而,它似乎只支持 Gradle 项目作为源依赖项。是否也可以使用 Maven 项目,如果可以,请展示一个示例。
build.gradle当我尝试在 Maven 项目中使用此功能时,Gradle 尝试在那里找到该文件(我在使用该--info选项运行 Gradle 时看到它)并失败,并显示如下错误消息:
Git repository at https://github.com/something/something.git did not contain a project publishing the specified dependency.
Bjø*_*ter 10
... 没有”。
\n在幕后,源依赖项是复合构建。这些需要是 Gradle 项目,因为外部项目与主项目合并。
\n...是:“是的,但很难”。
\n实际上,您链接到的同一篇博客文章中提到了它(强调我的):
\n\n\n源依赖性使这些用例更易于实现。Gradle 负责自动检查依赖项的正确版本,确保在需要时构建二进制文件。它在构建运行的任何地方都会执行此操作。签出的项目\xe2\x80\x99甚至不需要现有的 Gradle 构建。 此示例显示 Gradle 构建通过插件注入 Gradle 构建来消耗两个没有构建系统的源依赖项。注入的配置可以执行常规 Gradle 插件可以执行的任何操作,例如包装现有的 CMake 或 Maven 构建。
\n
因为听起来在 Maven 和 Gradle 项目之间建立源依赖关系的桥梁并不是世界上最重要的事情,所以我尝试了一下。除了传递依赖之外,我让它正常工作。您基本上需要执行上面链接的示例中所示的操作,但您不是构建本机库,而是调用 Maven(例如,使用 Gradle 的 Maven 插件)。
\n然而,我最终得到的脚本足够复杂,我建议您自己构建 Maven 项目,将其部署到本地 Maven 存储库,然后将该存储库添加到 Gradle 项目。
\n<编辑>
\n好的,下面是实际操作方法。该功能的文档很少,并且似乎主要针对本机项目(例如 C++ 或 Swift)。
\n以应用了 Java 插件的普通 Gradle 项目为例。我在一个空文件夹中执行了“gradle init”。假设在此项目中,您依赖于一个名为 `` 的库,稍后您希望将其包含为源依赖项:
\n// [root]/build.gradle\ndependencies {\n implementation \'org.example:my-maven-project:1.1\'\n}\nRun Code Online (Sandbox Code Playgroud)\n请注意,此处定义的版本号必须与存储库中的 Git 标记匹配。这是将要签出的代码修订版。
\n然后在设置文件中,我们为其定义一个源依赖关系映射:
\n// [root]/settings.gradle\nrootProject.name = \'my-project\'\n\nincludeBuild(\'plugins\') // [1]\n\nsourceControl {\n gitRepository("https://github.com/jitpack/maven-simple") { // [2]\n producesModule("org.example:my-maven-project") // [3]\n plugins {\n id "external-maven-build" // [4]\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\nplugins,稍后将对此进行解释。external-maven-build中定义的plugins,稍后会解释。在根项目中,我们定义了一个新的 Gradle 项目。同样,您可以将gradle init其初始化为 Groovy(或您喜欢的任何项目)。删除所有生成的源和测试。
// [root]/plugins/settings.gradle\n// Empty, but used to mark this as a stand-alone project (and not part of a multi-build)\nRun Code Online (Sandbox Code Playgroud)\n// [root]/plugins/build.gradle\nplugins {\n id \'groovy\'\n id \'java-gradle-plugin\' // [1]\n}\n\nrepositories {\n gradlePluginPortal() // [2]\n}\n\ndependencies {\n implementation "gradle.plugin.com.github.dkorotych.gradle.maven.exec:gradle-maven-exec-plugin:2.2.1" // [3]\n}\n\ngradlePlugin {\n plugins {\n "external-maven-build" { // [4]\n id = "external-maven-build"\n implementationClass = "org.example.ExternalMavenBuilder"\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n现在有趣的事情来了。我选择在 Groovy 中执行此操作,但也可以在任何受支持的 JVM 语言中执行此操作。
\n该插件结构与任何其他 Gradle 插件一样。需要注意的一件事是,它是一个设置插件,而您通常使用项目插件。这是必需的,因为我们基本上是在运行时定义 Gradle 项目,这需要作为初始化阶段的一部分完成。
\n// [root]/plugins/src/main/groovy/org/example/ExternalMavenBuilder.groovy\npackage org.example\n\nimport com.github.dkorotych.gradle.maven.exec.MavenExec\nimport org.gradle.api.Plugin\nimport org.gradle.api.artifacts.ConfigurablePublishArtifact\nimport org.gradle.api.initialization.Settings\n\nclass ExternalMavenBuilder implements Plugin<Settings> {\n void apply(Settings settings) {\n settings.with {\n rootProject.name = \'my-maven-project\' // [1]\n gradle.rootProject {\n group = "org.example" //[2]\n pluginManager.apply("base") // [3]\n pluginManager.apply("com.github.dkorotych.gradle-maven-exec") // [4]\n\n def mavenBuild = tasks.register("mavenBuild", MavenExec) {\n goals(\'clean\', \'package\') // [5]\n }\n\n artifacts.add("default", file("$projectDir/target/maven-simple-0.2-SNAPSHOT.jar")) { ConfigurablePublishArtifact a ->\n a.builtBy(mavenBuild) // [6]\n }\n }\n }\n }\n}\n\nRun Code Online (Sandbox Code Playgroud)\n请注意,它不会对传递依赖项进行建模,并且由于缺少输入和输出,它永远不会是最新的。
\n这是我玩了几个小时所得到的结果。我认为它可以推广为发布到 Gradle 门户的通用插件。但我认为我的任务已经太多了。如果有人想从这里继续,我会祝福你:)
\n| 归档时间: |
|
| 查看次数: |
2958 次 |
| 最近记录: |