如何将文件复制到目标,以便在运行任务中使用它们?

时间:2014-10-07 15:02:45

标签: sbt

我想在调用特殊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")

1 个答案:

答案 0 :(得分:2)

包含更新报告的自定义配置

基于ConfigurationsUpdate 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>}。{/}