복붙노트

[SCALA] 표준 작업 이후에 자동으로 실행 사용자 지정 작업 /

SCALA

표준 작업 이후에 자동으로 실행 사용자 지정 작업 /

나는 종종 표준 작업 중 하나를 실행하기 전에 몇 가지 사용자 정의를 수행합니다. 나는이 실행 내가 원하는 순서대로 작업을 기존의 것을 새로운 작업을 할 수 있습니다 실현,하지만 난 그가 대신 컴파일 내 컴파일을 실행하도록되어있는 개발자 미스가 크고 수정 오류로 하드를 리드하는 그 복잡하고 기회를 찾을 수 .

나는 사용자 지정 작업을 정의 할 수 있도록 종속성 기존 작업의 나무 (예를 들어 패키지 - 빈) 그래서 내 사용자 지정 작업이 바로 전에 실행될 때마다 누군가가 호출하는 패키지 - 빈 그로하고 주입 (앱 준비 말한다).

나는이 일을 시도

  def mySettings = {
    inConfig(Compile)(Seq(prepareAppTask <<= packageBin in Compile map { (pkg: File) =>
      // fiddle with the /target folder before package-bin makes it into a jar
    })) ++
    Seq(name := "my project", version := "1.0")
  }

  lazy val prepareAppTask = TaskKey[Unit]("prepare-app")

이 항아리에 컴파일 출력을 패키지하기 전에하지만 패키지 빈 오른쪽에 의해 자동으로 실행 아니에요. 그래서 내가 어떻게 적절한 시간에 실행되도록 위의 코드를 변경합니까?

더 일반적으로 어디 컴파일 같은 다른 작업과 후킹에 대한 정보를 찾을 수 있습니까 자신의 작업을하기 전에 및 표준 작업이 호출 된 후 실행되는 것을 보장하는 일반적인 방법은 무엇입니까?.

해결법

  1. ==============================

    1.기존 작업을 확장하는 것은 (기존 작업을 수정 섹션 봐)가 SBT 작업에 대한 문서가 설명되어 있습니다.

    기존 작업을 확장하는 것은 (기존 작업을 수정 섹션 봐)가 SBT 작업에 대한 문서가 설명되어 있습니다.

    이 같은:

    compile in Compile <<= (compile in Compile) map { _ => 
      // what you want to happen after compile goes here 
    }
    

    사실, 다른 방법이있다 - 컴파일에 의존하여 작업을 정의

    prepareAppTask := (whatever you want to do) dependsOn compile
    

    그리고 그 다음에 의존 packageBin 수정 :

    packageBin <<= packageBin dependsOn prepareAppTask
    

    (테스트 비,하지만 일반적으로 추력이 작동해야 위의 모두가, 나는 희망).

  2. ==============================

    2.@ 폴 백정으로 이전 답변에 대한 업데이 트 같이, 이것은 ==이 더 이상 지원되지 << 1.x의 버전 이후 SBT에서 약간 다른 방식으로 수행 될 수 없었다. 난 내 프로젝트 중 하나를 사용하는 것이 컴파일 전에 실행하는 샘플 작업의 예를했다 :

    @ 폴 백정으로 이전 답변에 대한 업데이 트 같이, 이것은 ==이 더 이상 지원되지 << 1.x의 버전 이후 SBT에서 약간 다른 방식으로 수행 될 수 없었다. 난 내 프로젝트 중 하나를 사용하는 것이 컴파일 전에 실행하는 샘플 작업의 예를했다 :

    lazy val wsdlImport = TaskKey[Unit]("wsdlImport", "Generates Java classes from WSDL")
    
    wsdlImport := {
      import sys.process._
      "./wsdl/bin/wsdl_import.sh" !
      // or do whatever stuff you need
    }
    
    (compile in Compile) := ((compile in Compile) dependsOn wsdlImport).value
    

    이것은이 1.x에서 이전에 수행 된 방법과 매우 유사

    또한, 기본적으로 작업의 조성 (대신 종속 계층의)는 공식 SBT의 문서에서 제안하는 또 다른 방법이있다. 상기와 같은 예를 복용 :

    (compile in Compile) := {
      val w = wsdlImport.value
      val c = (compile in Compile).value
      // you can add more tasks to composition or perform some actions with them
      c
    }
    

    첫 번째 예는 나를 위해로서, 비트 깔끔한을 보이지만 그것은, 어떤 경우에는 더 많은 유연성을 제공하는 것 같은 느낌이 든다.

    SBT 1.2.3에서 테스트하지만,뿐만 아니라 다른 1.x에서 함께 작동합니다.

  3. from https://stackoverflow.com/questions/7820939/run-custom-task-automatically-before-after-standard-task by cc-by-sa and MIT license