我想在调用特殊target
任务之前将工件从存储库复制到run
子目录。
// audit task must invoke the run task, after copy artifact in some directory
audit := {
println("In audit")
// 1. Copy some artifact to directory
val auditAgent = ((fullClasspath in Test value) filter (_.data.getName.startsWith("reactive-audit-agent"))).head.data
val targetAgent= target.value / "reactive-audit-libs" / "reactive-audit-agent.jar"
IO.copyFile(auditAgent,targetAgent)
// 2. Set javaOpt. Something like this
javaOptions += "-javagent:"+targetAgent
// 3. Invoke run task with javaagent
???
}
使用sbt run
我想运行该项目。
使用sbt audit
我想用特定的javagent运行项目。
我尝试使用fullRunTask(audit,...)
扩展audit
任务,但audit
中的正文未运行
audit := {
println("In audit")
}
fullRunTask(audit, Runtime, "com.octo.reactive.sample.TestApp")
答案 0 :(得分:2)
基于Configurations和Update Report,我发现了另一种声明依赖关系并在任务中使用它的方法。这种方法明确地声明了对任务所需的外部文件的依赖性,比如成为一个java代理。
我在回答的过去修订中似乎错过了要求:
使用
sbt run
我想运行该项目。使用sbt audit
我想用特定的javagent运行项目。
以下build.sbt
给出了一个解决方案(它假定带有the change for no blank lines的sbt 0.13.7-M3 - 如果您还不想升级则添加空行):
lazy val Agent = config("agent") extend Runtime
inConfig(Agent)(Defaults.configSettings)
sourceDirectory in Agent <<= sourceDirectory in Compile
ivyConfigurations += Agent
// that makes the file available in the Ivy2 local repository
libraryDependencies += "org.aspectj" % "aspectjweaver" % "1.8.2" % "agent"
fork in (Agent, run) := true
javaOptions in (Agent, run) +=
"-javaagent:" + update.value.select(configurationFilter("agent")).filter(_.name.contains("aspectjweaver")).head
addCommandAlias("audit", "agent:run")
构建定义了一个新的隐藏agent
配置,其依赖关系仅属于配置。
使用update
(如Update Report中所述)我可以选择声明的依赖关系作为&#34;代理&#34;对于run
,但由于配置extend Runtime
我必须排除其他&#34;传递&#34;依赖关系(Runtime
给出)。
执行run
时,它会运行旧的run
任务 - 此处不做任何更改:
> run
[info] Running com.example.Hello
Hello, world!
当您运行agent:run
时,它会在run
配置中执行自定义Agent
(除非您更改,否则看不到任何更改 - 在-javaagent
中输入错误信息最终打破了创业公司):
> agent:run
[info] Running com.example.Hello
[info] Hello, world!
作为最终解决方案,audit
别名有效agent:run
。
> audit
[info] Running com.example.Hello
[info] Hello, world!
使用解决方案sbt像往常一样下载依赖项(因此我们不必担心文件是否存在以及何时不存在,构建将失败)。
在运行项目之前,如何将一些文件复制到目录?
阅读Generating files页,找到标有Generate resources的部分:
资源生成任务应该在resourceManaged的子目录中生成资源,并返回生成的文件序列。
show resourceManaged
target/scala-[scalaVersion]
{{1}}下{{1}} {/ 1>}。{/}