레이크 과제 내에서 레이크 과제를 실행하는 방법은 무엇입니까?
글로벌 변수에 따라 프로젝트를 두 가지 방식으로 컴파일하는 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)
이것은 요구된 것보다 조금 더 많은 것을 제공하지만, 제 요점을 수 있습니다.
- 필요에 따라 출력 디렉터리가 생성됩니다.
- 파일은 필요한 경우에만 다시 컴파일됩니다(이 예제는 가장 간단한 test.c 파일에 대해서만 정확합니다).
- 릴리스 빌드 또는 디버그 빌드를 트리거하려면 모든 작업을 즉시 수행할 수 있습니다.
- 이 예제에는 디버그와 릴리스-디버깅 간의 작은 차이를 정의하는 방법도 포함되어 있습니다.
- 이제는 빌드마다 작업이 다르기 때문에 글로벌 변수로 매개 변수화된 빌드 작업을 다시 활성화할 필요가 없습니다.빌드 태스크의 코드 재사용은 코드를 재사용하여 빌드 태스크를 정의함으로써 수행됩니다.루프가 동일한 작업을 두 번 실행하지 않고 생성된 작업을 어떻게 실행하는지 확인합니다. 나중에 트리거할 수 있습니다(전체 작업 또는 레이크 명령줄에서 이 중 하나를 선택).
언급URL : https://stackoverflow.com/questions/577944/how-to-run-rake-tasks-from-within-rake-tasks
'source' 카테고리의 다른 글
안드로이드에서 가로 모드를 비활성화하려면 어떻게 해야 합니까? (0) | 2023.06.01 |
---|---|
SQL Azure 데이터베이스의 이름을 바꾸시겠습니까? (0) | 2023.06.01 |
문자열 날짜를 NSDate로 변환하려면 어떻게 해야 합니까? (0) | 2023.05.27 |
Azure Blob 스토리지 컨텐츠를 백업하는 가장 좋은 방법은 무엇입니까? (0) | 2023.05.27 |
MsSQL에서 간단한 '찾기 및 바꾸기'를 수행하려면 어떻게 해야 합니까? (0) | 2023.05.27 |