重用 gradle.kts 函数

Voj*_*ěch 5 gradle gradle-kotlin-dsl

我有一个多项目 gradle.kts 设置,我想重用一个函数,例如。

fun doSomethingWithString(string: String) { return string }
Run Code Online (Sandbox Code Playgroud)

然后我在dependencies {}块中使用该函数。

我想:

  • fun在根内定义build.gradle.kts
  • fun在我可以在每个子项目中导入的其他文件中定义

这可行吗?

Chr*_*iki 10

buildSrc您可以在项目中创建您的函数。

\n

有多种方法可以解决这个问题。这里仅举两个例子来说明如何做到这一点。两者使用相同的buildSrc/build.gradle.kts

\n
plugins {\n    `kotlin-dsl`\n}\n\nrepositories {\n    jcenter()\n}\n
Run Code Online (Sandbox Code Playgroud)\n

示例:共享包级函数

\n

您可以创建包级函数,例如buildSrc/src/main/kotlin/myconvention/myconventions.kt

\n
package myconvention\n\nfun doSomethingWithString(string: String): String {\n  return string + "321"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

然后在您的(子)项目构建脚本中,您可以按如下方式访问该函数:

\n
println(myconvention.doSomethingWithString("foo"))\n
Run Code Online (Sandbox Code Playgroud)\n

示例:预编译脚本插件

\n

您可以在预编译脚本插件中将该函数创建为项目的额外属性,例如,如果您有buildSrc/src/main/kotlin/myproject.conventions.gradle.kts

\n
val doSomethingWithString by extra(\n  fun(string: String): String {\n    return string + "123"\n  }\n)\n
Run Code Online (Sandbox Code Playgroud)\n

然后在您的(子)项目构建脚本中,您可以按如下方式访问该函数:

\n
plugins {\n    id("myproject.conventions")\n}\nval doSomethingWithString: (String) -> String by extra\n\nprintln(doSomethingWithString("foo"))\n
Run Code Online (Sandbox Code Playgroud)\n

第一个示例的最小工作配置

\n

完整的根项目目录结构(不包括Gradle Wrapper文件):

\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 mysub\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 build.gradle.kts\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 buildSrc\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 build.gradle.kts\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main\n\xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 kotlin\n\xe2\x94\x82\xc2\xa0\xc2\xa0             \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 myconvention\n\xe2\x94\x82\xc2\xa0\xc2\xa0                 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 myconventions.kt\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 settings.gradle.kts\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • mysub/build.gradle.kts仅包含println(myconvention.doSomethingWithString("foo"))
  • \n
  • buildSrc/build.gradle.ktsbuildSrc/src/main/kotlin/myconvention/myconventions.kt具有上述确切内容
  • \n
  • settings.gradle.kts:
  • \n
\n
rootProject.name = "my_test"\ninclude("mysub")\n
Run Code Online (Sandbox Code Playgroud)\n

运行时./gradlew projects(使用 Gradle 6.7.1),输出包含以下内容,如预期:

\n
> Configure project :mysub\nfoo321\n
Run Code Online (Sandbox Code Playgroud)\n

  • 第一种方式是我想要追求的。然而它似乎不起作用:一旦我尝试在子项目中使用“myconvention.doSomethibg”,它就会显示“myconvention”的“未解析的引用”。我也尝试过“import myconvention.doSomething”,但没有成功。请注意,“buildSrc”项目未添加到“settings.gradle.kts”中,因为这也会导致错误。 (3认同)