我有一个多模块gradle构建.我想使用root执行一个模块的目标.例如:
gradle build -Pmodule=ABC
gradle jar -Pmodule=ABC
gradle test -Pmodule=ABC
gradle compileJava -Pmodule=ABC
gradle customTask -Pmodule=ABC
etc.
Run Code Online (Sandbox Code Playgroud)
因此,每个目标都可以从root指定模块运行.有一个简单的方法吗?
谢谢 !
当任务没有产生任何输出时,如何正确地将Gradle任务标记为"最新"?如果上次运行成功并且输入自那时起没有改变,则任务应保持"最新".Gradle指南在第15.9.2节之前说明,如下:
"A task with no defined outputs will never be considered up-to-date."
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如何将任务标记为最新?似乎Gradle需要知道上次成功运行的时间,然后将其与输入的最后修改时间进行比较.作为一种解决方法,脚本可以创建/触摸空文件以将任务标记为完成?还有其他建议的解决方法吗?
使用Android Studio 1.3.2,不断修改.idea/codeStyleSettings.xml以添加部分<Objective-C-extensions>...</Objective-C-extensions\>.尽管项目中没有Objective-C代码,但这些更改仍然存在.经过多次尝试,我无法恢复这些更改 - 每次打开Android Studio时它们都会不断恢复.
这些更改来自何处以及如何避免Android Studio不断恢复修改?
<Objective-C-extensions>
<option name="GENERATE_INSTANCE_VARIABLES_FOR_PROPERTIES" value="ASK" />
<option name="RELEASE_STYLE" value="IVAR" />
<option name="TYPE_QUALIFIERS_PLACEMENT" value="BEFORE" />
<file>
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
</file>
<class>
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" …Run Code Online (Sandbox Code Playgroud) 如何在不使用javac编译源代码的情况下运行注释处理器(Java 8不能使用Apt)?
是否有任何javac参数只能运行注释处理而不编译所有文件?
我想通过javac做什么:
只需找到带注释的元素并使用-processor标志使用定义的注释处理器处理它们
千万不能编译没有任何注解的源
因为我想在Java 8上执行此操作,所以无法使用Apt执行此任务?或许它是?
如果使用Swift扩展将重载方法添加到Objective-C类,它似乎只调用第一个方法,在运行时产生意外行为或崩溃.Swift类的扩展(与Objective-C相对)可以正常工作.我想确定是否有任何解决方法,并确认这是一个我应该向Apple报告的错误.鉴于Objective-C不支持Swift的重载方法,我可以想象将两者混合是一个问题的处方.
除了具有init函数的Objective-C类之外,获取扩展的类都是空的.ObjClass在.h和.m文件中声明,并使用Swift桥接头导入.原始SwiftClass在代码示例中与Swift扩展一起定义:
extension ObjClass {
func log(param: Int32) { NSLog("ObjClass->Int32: " + String(param)) }
func log(param: String) { NSLog("ObjClass->String: " + param) }
func log(param: ObjClass) { NSLog("ObjClass->ObjClass") }
}
class SwiftClass {
}
extension SwiftClass {
func log(param: Int32) { NSLog("SwiftClass->Int32: " + String(param)) }
func log(param: String) { NSLog("SwiftClass->String: " + param) }
func log(param: ObjClass) { NSLog("SwiftClass->ObjClass") }
}
Run Code Online (Sandbox Code Playgroud)
现在用字符串,int和object调用重载的方法:
var objClass = ObjClass()
objClass.log(10)
objClass.log("string")
objClass.log(objClass)
var swiftClass = SwiftClass()
swiftClass.log(10)
swiftClass.log("string")
swiftClass.log(objClass)
Run Code Online (Sandbox Code Playgroud)
对于ObjClass,所有方法调用都是对类型为Int32的第一个方法进行的.通过使用COpaquePointer,我可以看到这与对象指针有关但略有不同. …
作为测试Gradle插件的一部分,我想找出一个groovy方法:project.exec {...}.这是为了确认它正在进行正确的命令行调用.我正在尝试使用元编程:
Project proj = ProjectBuilder.builder().build()
proj.metaClass.exec = { Closure obj ->
println 'MOCK EXEC'
}
proj.exec {
executable 'echo'
args 'PROJECT EXEC'
}
// prints 'PROJECT EXEC' instead of the 'MOCK EXEC' I expected
Run Code Online (Sandbox Code Playgroud)
令人好奇的是,如果我将两种exec方法重命名为othername,那么它可以正常工作:
Project proj = ProjectBuilder.builder().build()
proj.metaClass.othername = { Closure obj ->
println 'MOCK EXEC'
}
proj.othername {
executable 'echo'
args 'PROJECT EXEC'
}
// prints 'MOCK EXEC' as expected
Run Code Online (Sandbox Code Playgroud)
我试图找出为什么现有project.exec方法导致元编程失败以及是否有解决方法.请注意,这Project是一个接口,但我正在嘲笑一个特定的类型实例DefaultProject.
用于删除单个方法的元编程方法来自这个答案:https: …
我想要反馈关于定义依赖于外部状态的插件任务的最佳实践(即在引用该插件的build.gradle中定义).我正在使用扩展对象和闭包来推迟访问这些设置,直到它们需要和可用.我也对在任务之间共享状态感兴趣,例如将一个任务的输出配置为另一个任务的输入.
代码使用"project.afterEvaluate"来定义通过扩展对象配置所需设置时的任务.这似乎比应该更复杂.如果我将代码移出"afterEvaluate",它将获得compileFlag == null,这不是外部设置.如果再次更改代码以使用<<或doLast语法,那么它将获得外部标志...但是它无法使用类型:Exec和其他类似的有用类型.
我觉得我在某些方面与Gradle作战,这意味着我不太了解如何更好地与它合作.以下是我正在使用的简化伪代码.这有效,但我希望看看这是否可以简化,或者确实是最佳做法.此外,除非正在执行任务,否则不应抛出异常.
apply plugin: MyPlugin
class MyPluginExtension {
String compileFlag = null
}
class MyPlugin implements Plugin<Project> {
void apply(Project project) {
project.extensions.create("myPluginConfig", MyPluginExtension)
project.afterEvaluate {
// Closure delays getting and checking flag until strictly needed
def compileFlag = {
if (project.myPluginConfig.compileFlag == null) {
throw new InvalidUserDataException(
"Must set compileFlag: myPluginConfig { compileFlag = '-flag' }")
}
return project.myPluginConfig.compileFlag
}
// Inputs for translateTask
def javaInputs = {
project.files(project.fileTree(
dir: project.projectDir, includes: ['**/*.java']))
}
// This …Run Code Online (Sandbox Code Playgroud)