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.ktsfun在我可以在每个子项目中导入的其他文件中定义这可行吗?
Chr*_*iki 10
buildSrc您可以在项目中创建您的函数。
有多种方法可以解决这个问题。这里仅举两个例子来说明如何做到这一点。两者使用相同的buildSrc/build.gradle.kts:
plugins {\n `kotlin-dsl`\n}\n\nrepositories {\n jcenter()\n}\nRun Code Online (Sandbox Code Playgroud)\n您可以创建包级函数,例如buildSrc/src/main/kotlin/myconvention/myconventions.kt:
package myconvention\n\nfun doSomethingWithString(string: String): String {\n return string + "321"\n}\nRun Code Online (Sandbox Code Playgroud)\n然后在您的(子)项目构建脚本中,您可以按如下方式访问该函数:
\nprintln(myconvention.doSomethingWithString("foo"))\nRun Code Online (Sandbox Code Playgroud)\n您可以在预编译脚本插件中将该函数创建为项目的额外属性,例如,如果您有buildSrc/src/main/kotlin/myproject.conventions.gradle.kts:
val doSomethingWithString by extra(\n fun(string: String): String {\n return string + "123"\n }\n)\nRun Code Online (Sandbox Code Playgroud)\n然后在您的(子)项目构建脚本中,您可以按如下方式访问该函数:
\nplugins {\n id("myproject.conventions")\n}\nval doSomethingWithString: (String) -> String by extra\n\nprintln(doSomethingWithString("foo"))\nRun Code Online (Sandbox Code Playgroud)\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\nRun Code Online (Sandbox Code Playgroud)\nmysub/build.gradle.kts仅包含println(myconvention.doSomethingWithString("foo"))buildSrc/build.gradle.kts并buildSrc/src/main/kotlin/myconvention/myconventions.kt具有上述确切内容settings.gradle.kts:rootProject.name = "my_test"\ninclude("mysub")\nRun Code Online (Sandbox Code Playgroud)\n运行时./gradlew projects(使用 Gradle 6.7.1),输出包含以下内容,如预期:
> Configure project :mysub\nfoo321\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
402 次 |
| 最近记录: |