source

레이크 과제 내에서 레이크 과제를 실행하는 방법은 무엇입니까?

lovecheck 2023. 6. 1. 22:48
반응형

레이크 과제 내에서 레이크 과제를 실행하는 방법은 무엇입니까?

글로벌 변수에 따라 프로젝트를 두 가지 방식으로 컴파일하는 Rake 파일을 가지고 있습니다.$build_type어느 쪽인가 하면:debug또는:release(결과는 별도의 디렉토리로 이동):

task :build => [:some_other_tasks] do
end

다음과 같은 두 가지 구성으로 프로젝트를 컴파일하는 작업을 만들고 싶습니다.

task :build_all do
  [ :debug, :release ].each do |t|
    $build_type = t
    # call task :build with all the tasks it depends on (?)
  end
end

작업을 메소드처럼 호출하는 방법이 있습니까?아니면 어떻게 비슷한 것을 달성할 수 있습니까?

만약 당신이 방법으로 행동하기 위해 작업이 필요하다면, 실제 방법을 사용하는 것입니다.

task :build => [:some_other_tasks] do
  build
end

task :build_all do
  [:debug, :release].each { |t| build t }
end

def build(type = :debug)
  # ...
end

만약 당신이 계속하고 싶다면,rake의 관용구는 다음과 같습니다. 과거의 답변을 바탕으로 작성한 것입니다.

  • 이 명령은 항상 작업을 실행하지만 종속성은 실행하지 않습니다.

    Rake::Task["build"].execute
    
  • 이 명령은 종속성을 실행하지만 아직 호출되지 않은 경우에만 작업을 실행합니다.

    Rake::Task["build"].invoke
    
  • 이렇게 하면 먼저 작업의 already_invokeed 상태가 재설정되어 작업이 다시 실행될 수 있습니다. 종속성 및 모든 항목:

    Rake::Task["build"].reenable
    Rake::Task["build"].invoke
    
  • 이미 호출된 종속성은 다시 사용하도록 설정하지 않으면 자동으로 다시 실행되지 않습니다.Rake > = 10.3.2에서는 다음을 사용하여 이러한 기능도 다시 활성화할 수 있습니다.

    Rake::Task["build"].all_prerequisite_tasks.each(&:reenable)
    

예:

Rake::Task["db:migrate"].invoke
task :build_all do
  [ :debug, :release ].each do |t|
    $build_type = t
    Rake::Task["build"].reenable
    Rake::Task["build"].invoke
  end
end

그렇게 하면 당신도 해결될 겁니다. 저도 같은 것이 필요했을 뿐입니다.

task :invoke_another_task do
  # some code
  Rake::Task["another:task"].invoke
end
task :build_all do
  [ :debug, :release ].each do |t|
    $build_type = t
    Rake::Task["build"].execute
  end
end

실패에 관계없이 각 태스크를 실행하려면 다음과 같은 작업을 수행할 수 있습니다.

task :build_all do
  [:debug, :release].each do |t| 
    ts = 0
    begin  
      Rake::Task["build"].invoke(t)
    rescue
      ts = 1
      next
    ensure
      Rake::Task["build"].reenable # If you need to reenable
    end
    return ts # Return exit code 1 if any failed, 0 if all success
  end
end

프로젝트가 실제로 컴파일되어 파일이 생성되는 경우 일반 디버그 및 릴리스 작업을 생성하지 않는 것이 좋습니다.예를 들어 설명한 것처럼 출력이 다른 디렉토리로 이동하는 파일 작업을 수행해야 합니다.프로젝트에서 test.c 파일을 out/debug/test.out으로 컴파일하고 gcc로 out/release/test.out을 컴파일하면 프로젝트를 다음과 같이 설정할 수 있습니다.

WAYS = ['debug', 'release']
FLAGS = {}
FLAGS['debug'] = '-g'
FLAGS['release'] = '-O'
def out_dir(way)
  File.join('out', way)
end
def out_file(way)
  File.join(out_dir(way), 'test.out')
end
WAYS.each do |way|
  desc "create output directory for #{way}"
  directory out_dir(way)

  desc "build in the #{way}-way"
  file out_file(way) => [out_dir(way), 'test.c'] do |t|
    sh "gcc #{FLAGS[way]} -c test.c -o #{t.name}"
  end
end
desc 'build all ways'
task :all => WAYS.map{|way|out_file(way)}

task :default => [:all]

이 설정은 다음과 같이 사용할 수 있습니다.

rake all # (builds debug and release)
rake debug # (builds only debug)
rake release # (builds only release)

이것은 요구된 것보다 조금 더 많은 것을 제공하지만, 제 요점을 수 있습니다.

  1. 필요에 따라 출력 디렉터리가 생성됩니다.
  2. 파일은 필요한 경우에만 다시 컴파일됩니다(이 예제는 가장 간단한 test.c 파일에 대해서만 정확합니다).
  3. 릴리스 빌드 또는 디버그 빌드를 트리거하려면 모든 작업을 즉시 수행할 수 있습니다.
  4. 이 예제에는 디버그와 릴리스-디버깅 간의 작은 차이를 정의하는 방법도 포함되어 있습니다.
  5. 이제는 빌드마다 작업이 다르기 때문에 글로벌 변수로 매개 변수화된 빌드 작업을 다시 활성화할 필요가 없습니다.빌드 태스크의 코드 재사용은 코드를 재사용하여 빌드 태스크를 정의함으로써 수행됩니다.루프가 동일한 작업을 두 번 실행하지 않고 생성된 작업을 어떻게 실행하는지 확인합니다. 나중에 트리거할 수 있습니다(전체 작업 또는 레이크 명령줄에서 이 중 하나를 선택).

언급URL : https://stackoverflow.com/questions/577944/how-to-run-rake-tasks-from-within-rake-tasks

반응형