Tôi sẽ đề nghị không tạo các tác vụ gỡ lỗi và phát hành chung nếu dự án thực sự là thứ được biên dịch và do đó dẫn đến các tệp. Bạn nên đi với các tác vụ tệp hoàn toàn có thể thực hiện được trong ví dụ của bạn, như bạn nêu, rằng đầu ra của bạn đi vào các thư mục khác nhau. Giả sử dự án của bạn chỉ biên dịch tệp test.c thành out / debug / test.out và out / release / test.out với gcc bạn có thể thiết lập dự án của mình như thế này:
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]
Thiết lập này có thể được sử dụng như:
rake all # (builds debug and release)
rake debug # (builds only debug)
rake release # (builds only release)
Điều này làm nhiều hơn một chút khi được yêu cầu, nhưng cho thấy quan điểm của tôi:
- thư mục đầu ra được tạo ra, khi cần thiết.
- các tệp chỉ được biên dịch lại nếu cần (ví dụ này chỉ đúng với các tệp test.c đơn giản nhất).
- bạn có sẵn tất cả các nhiệm vụ nếu muốn kích hoạt bản dựng phát hành hoặc bản dựng gỡ lỗi.
- ví dụ này bao gồm một cách để xác định những khác biệt nhỏ giữa gỡ lỗi và phát hành bản dựng.
- không cần phải thực hiện một nhiệm vụ xây dựng được tham số hóa với một biến toàn cục, bởi vì bây giờ các bản dựng khác nhau có các nhiệm vụ khác nhau. mã hóa của tác vụ xây dựng được thực hiện bằng cách sử dụng lại mã để xác định các tác vụ xây dựng. xem cách vòng lặp không thực hiện cùng một tác vụ hai lần, nhưng thay vào đó, các tác vụ được tạo, sau đó có thể được kích hoạt (bằng toàn bộ tác vụ hoặc chọn một trong số chúng trên dòng lệnh cào).