3

如何在模型 DSL 的字符串中替换项目属性?我尝试了以下方法:

apply plugin: 'com.android.model.native'

model {
    android {
        ...

        sources {
            main {
                jni {
                    source {
                        srcDirs "src"
                        include "*.cpp"
                    }
                    exportedHeaders {
                        srcDir "${project.rootDir}/include"
                    }
                }
            }
        }
    }
}

但我得到了这个错误:

Error:Attempt to read a write only view of model of type 'org.gradle.model.ModelMap<org.gradle.language.base.FunctionalSourceSet>' given to rule 'android { ... } @ android/build.gradle line 6, column 5'

如果我将属性值分配给模型块之外的变量并替换该变量,它会起作用:

def fooDir = project.rootDir
...
srcDir "${fooDir}/include"

但这有点不方便。

4

1 回答 1

0

这是一个奇怪的错误,但这意味着您正在尝试访问尚未声明为您正在创建的规则的输入的属性。要将某些内容声明为输入,您必须对模型 dsl 使用“特殊语法”。例如,要访问project.buildDir,您必须使用:

$.buildDir

不幸的是,project.rootDir还没有绑定到模型路径。将值缓存在模型规则可访问的变量中(正如您所做的那样)目前似乎是一个不错的解决方法。

于 2016-03-21T07:37:08.907 回答