将编译器参数设置为新语言插件中的字符串列表
Setting compiler args as list of string in new language plugin
我正在为一种新语言开发一个插件,我试图为编译器添加对编译选项的支持。我使用 org.gradle.api.tasks.compile.CompileOptions
class 作为起点并实现了我自己的 class 如下:
class SvCompileOptions extends AbstractOptions {
private List<String> compilerArgs = Lists.newArrayList();
@Input
public List<String> getCompilerArgs() {
return compilerArgs;
}
public void setCompilerArgs(List<String> compilerArgs) {
this.compilerArgs = compilerArgs;
}
}
在我的 build.gradle 文件中,我尝试执行以下操作:
compileSv {
options.compilerArgs += [ "-foo" ]
}
(compileSv 是一个选项 属性 类型为 SvCompileOptions 的任务。)
我收到以下错误:
A problem occurred evaluating project ':uvc2'.
> java.lang.AbstractMethodError (no error message)
如果我将这一行替换为:
compileSv {
options.compilerArgs.add("-foo")
}
然后一切正常,但不是很gradlesque。
有人可以指出我做错了什么吗?
根据@tim_yates'的建议,我添加了一个附加到 compilerArgs
:
的函数
class SvCompileOptions extends AbstractOptions {
void compilerArgs(String... args) {
this.compilerArgs.addAll(args as List)
}
}
根据@Opal 的建议,我创建了一个准系统示例:
// File 'build.gradle'
buildscript {
dependencies {
classpath 'com.google.guava:guava:16+'
}
repositories {
mavenCentral()
}
}
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
class SvCompileOptions extends AbstractOptions {
private List<String> compilerArgs = Lists.newArrayList();
@Input
public List<String> getCompilerArgs() {
return compilerArgs;
}
public void setCompilerArgs(List<String> compilerArgs) {
this.compilerArgs = compilerArgs;
}
void compilerArgs(String... args) {
this.compilerArgs.addAll(args as List)
}
}
class SvCompile extends DefaultTask {
@TaskAction
protected void compile() {
println options.compilerArgs
}
@Nested
SvCompileOptions options = new SvCompileOptions()
}
task compileSv(type: SvCompile)
compileSv {
options.compilerArgs 'foo', 'bar'
}
代码将参数附加到空列表并按预期打印 [foo, bar]
。如果我们尝试使用以下内容覆盖参数:
compileSv {
options.compilerArgs = ['one', 'two']
}
打印错误消息:
* What went wrong:
A problem occurred evaluating root project 'so_compile_options2'.
> SvCompileOptions.setProperty(Ljava/lang/String;Ljava/lang/Object;)V
我不确定为什么当 classes 内联在 build.gradle
中时错误消息不同,但我认为这就是导致 AbstractMethodError
的原因看到了。
正如@Opal 所指出的,这个问题是由 AbstractOptions
class 中的某些魔法引起的。我尝试将以下方法添加到编译选项class,但错误信息仍然存在:
class SvCompileOptions extends AbstractOptions {
private static final ImmutableSet<String> EXCLUDE_FROM_ANT_PROPERTIES =
ImmutableSet.of("compilerArgs");
@Override
protected boolean excludeFromAntProperties(String fieldName) {
return EXCLUDE_FROM_ANT_PROPERTIES.contains(fieldName);
}
// ...
}
exclude 函数似乎根本没有被调用,就好像我在其中添加了一个虚拟打印,它永远不会被发出。
这应该有效
options.compilerArgs << "-foo"
如果您想添加多个值(您可能会在某个时候这样做),一种惯用的方法是将您的 class 更改为:
class SvCompileOptions extends AbstractOptions {
@Input
List<String> compilerArgs = Lists.newArrayList();
def args(String... args) {
this.compilerArgs += args.toList()
}
}
那么,你可以这样做:
compileSv {
options.args "-foo", "-bar"
}
在@Opal 提出从 AbstractOptions
扩展的宝贵见解是问题的根源并在 Gradle Github 页面上找到与 removing the AbstractOptions
class altogether 相关的问题之后,我认为最好的办法就是根本不使用基数 class。
整合@tim_yates'对'append'方法的建议后,我将采用以下实现:
class SvCompileOptions {
private List<String> compilerArgs = Lists.newArrayList();
@Input
public List<String> getCompilerArgs() {
return compilerArgs;
}
// Overwrites
public void setCompilerArgs(List<String> compilerArgs) {
this.compilerArgs = compilerArgs;
}
// Appends
void compilerArgs(String... args) {
this.compilerArgs.addAll(args as List)
}
}
这允许用户附加参数:
compileSv {
options.compilerArgs 'foo', 'bar'
}
并覆盖它们:
compileSv {
options.compilerArgs = ['one', 'two']
}
我正在为一种新语言开发一个插件,我试图为编译器添加对编译选项的支持。我使用 org.gradle.api.tasks.compile.CompileOptions
class 作为起点并实现了我自己的 class 如下:
class SvCompileOptions extends AbstractOptions {
private List<String> compilerArgs = Lists.newArrayList();
@Input
public List<String> getCompilerArgs() {
return compilerArgs;
}
public void setCompilerArgs(List<String> compilerArgs) {
this.compilerArgs = compilerArgs;
}
}
在我的 build.gradle 文件中,我尝试执行以下操作:
compileSv {
options.compilerArgs += [ "-foo" ]
}
(compileSv 是一个选项 属性 类型为 SvCompileOptions 的任务。)
我收到以下错误:
A problem occurred evaluating project ':uvc2'.
> java.lang.AbstractMethodError (no error message)
如果我将这一行替换为:
compileSv {
options.compilerArgs.add("-foo")
}
然后一切正常,但不是很gradlesque。
有人可以指出我做错了什么吗?
根据@tim_yates'的建议,我添加了一个附加到 compilerArgs
:
class SvCompileOptions extends AbstractOptions {
void compilerArgs(String... args) {
this.compilerArgs.addAll(args as List)
}
}
根据@Opal 的建议,我创建了一个准系统示例:
// File 'build.gradle'
buildscript {
dependencies {
classpath 'com.google.guava:guava:16+'
}
repositories {
mavenCentral()
}
}
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
class SvCompileOptions extends AbstractOptions {
private List<String> compilerArgs = Lists.newArrayList();
@Input
public List<String> getCompilerArgs() {
return compilerArgs;
}
public void setCompilerArgs(List<String> compilerArgs) {
this.compilerArgs = compilerArgs;
}
void compilerArgs(String... args) {
this.compilerArgs.addAll(args as List)
}
}
class SvCompile extends DefaultTask {
@TaskAction
protected void compile() {
println options.compilerArgs
}
@Nested
SvCompileOptions options = new SvCompileOptions()
}
task compileSv(type: SvCompile)
compileSv {
options.compilerArgs 'foo', 'bar'
}
代码将参数附加到空列表并按预期打印 [foo, bar]
。如果我们尝试使用以下内容覆盖参数:
compileSv {
options.compilerArgs = ['one', 'two']
}
打印错误消息:
* What went wrong:
A problem occurred evaluating root project 'so_compile_options2'.
> SvCompileOptions.setProperty(Ljava/lang/String;Ljava/lang/Object;)V
我不确定为什么当 classes 内联在 build.gradle
中时错误消息不同,但我认为这就是导致 AbstractMethodError
的原因看到了。
正如@Opal 所指出的,这个问题是由 AbstractOptions
class 中的某些魔法引起的。我尝试将以下方法添加到编译选项class,但错误信息仍然存在:
class SvCompileOptions extends AbstractOptions {
private static final ImmutableSet<String> EXCLUDE_FROM_ANT_PROPERTIES =
ImmutableSet.of("compilerArgs");
@Override
protected boolean excludeFromAntProperties(String fieldName) {
return EXCLUDE_FROM_ANT_PROPERTIES.contains(fieldName);
}
// ...
}
exclude 函数似乎根本没有被调用,就好像我在其中添加了一个虚拟打印,它永远不会被发出。
这应该有效
options.compilerArgs << "-foo"
如果您想添加多个值(您可能会在某个时候这样做),一种惯用的方法是将您的 class 更改为:
class SvCompileOptions extends AbstractOptions {
@Input
List<String> compilerArgs = Lists.newArrayList();
def args(String... args) {
this.compilerArgs += args.toList()
}
}
那么,你可以这样做:
compileSv {
options.args "-foo", "-bar"
}
在@Opal 提出从 AbstractOptions
扩展的宝贵见解是问题的根源并在 Gradle Github 页面上找到与 removing the AbstractOptions
class altogether 相关的问题之后,我认为最好的办法就是根本不使用基数 class。
整合@tim_yates'对'append'方法的建议后,我将采用以下实现:
class SvCompileOptions {
private List<String> compilerArgs = Lists.newArrayList();
@Input
public List<String> getCompilerArgs() {
return compilerArgs;
}
// Overwrites
public void setCompilerArgs(List<String> compilerArgs) {
this.compilerArgs = compilerArgs;
}
// Appends
void compilerArgs(String... args) {
this.compilerArgs.addAll(args as List)
}
}
这允许用户附加参数:
compileSv {
options.compilerArgs 'foo', 'bar'
}
并覆盖它们:
compileSv {
options.compilerArgs = ['one', 'two']
}