Как мне получить: Rake-задача по умолчанию зависит от задачи с аргументами? - PullRequest
1 голос
/ 12 августа 2010

Я играл с Rake и Albacore, чтобы посмотреть, смогу ли я заменить наш существующий скрипт MSBuild, который развертывает программное обеспечение, чем-то, что не является XML.У меня есть задача, которая изменит значение отладки внутри web.config на false.Задача принимает каталог web.config в качестве аргумента, но я не могу понять синтаксис, необходимый для предоставления этого аргумента в задаче по умолчанию.

require 'albacore'
require 'nokogiri'

deployment_path = 'c:/test-mars-deploy'

task :default => [ :build, :publish, :update_web_config['c:/test-mars-deploy'] ]

task :update_web_config, :deploy_path do |t, args|  
  deployment_path = #{args[:deploy_path]}
  web_config_path = File.join deployment_path, 'Web.config'

  File.open(web_config_path, 'r+') do |f|
    doc = Nokogiri::XML(f)
    puts 'finding attribute'
    attribute = doc.xpath('/configuration/system.web/compilation')
    attribute.attr('debug', 'false')
    puts attribute.to_xml
  end

  File.delete(web_config_path)

  File.new(web_config_path, 'w') do |f|
    f.write(doc.to_s)
  end
end

Ответы [ 4 ]

2 голосов
/ 10 октября 2012

Нотация зависимости задачи не поддерживает передачу аргументов. Он принимает только имена или символы, относящиеся к именам задач.

task :default => [ :build, :publish, :update_web_config['c:/test-mars-deploy'] ]

Тебе нужно сделать что-то подобное.

task :default => [ :build, :publish ] do
    Rake::Task[:update_web_config].invoke 'c:/test-mars-deploy'
end

Помните, что invoke будет работать только один раз на задачу, даже с разными аргументами. Это настоящий вызов цепочки зависимостей. Но это вызовет все зависимые задачи. Вы можете использовать execute, если вам нужно несколько выполнений, но это не вызовет зависимые задачи.

Rake::Task[:update_web_config].invoke 'c:/test-mars-deploy'
Rake::Task[:update_web_config].execute 'c:/test-mars-deploy2'
Rake::Task[:update_web_config].execute 'c:/test-mars-deploy3'

В общем, я не рекомендую ни один из этих подходов. Мне кажется, что вызов invoke или execute указывает на плохо структурированную задачу. У вас просто нет этой проблемы, если вы преждевременно не параметризуетесь.

web_config = 'c:/test-mars-deploy/Web.config'

task :update_web_config do
  File.open(web_config, 'r+') do |file|
    # ...
  end
end

Если вы должны параметризироваться, укажите массив или FileList и сгенерируйте задачи для каждого элемента.

web_configs = FileList['c:/test-*/Web.config']

web_configs.each do |config|
  task config do
    File.open(config, 'r+') do |file|
      # ...
    end
  end
end

task :update_all_web_configs => web_configs

Еще лучше, я опубликовал задание обновления конфигурации , которое сделает все это за вас! Укажите FileList для обновления и хэш запросов xpath => replacements.

appconfig :update_web_configs do |x|
  x.files = FileList['c:/test-*/Web.config']
  x.replacements = {
    "/configuration/system.web/compilation/@debug" => 'False' }
end
0 голосов
/ 20 октября 2013

Нотация зависимости задачи фактически поддерживает передачу аргументов.Например, скажите «версия» в качестве аргумента:

task :default, [:version] => [:build]

task :build, :version do |t,args|
  version = args[:version]
  puts version ? "version is #{version}" : "no version passed"
end

Тогда вы можете назвать его так:

$ rake
no version passed

или

$ rake default[3.2.1]
version is 3.2.1

или

$ rake build[3.2.1]
version is 3.2.1

Однако я не нашел способа избежать указания имени задачи (по умолчанию или сборка) при передаче аргументов.Хотелось бы услышать, если кто-нибудь знает способ.

0 голосов
/ 12 августа 2010

Я думаю, вам, возможно, придется использовать передачу параметров старого стиля, например:

nicholas@hal:/tmp$ cat Rakefile
task :default => :all

deploy_path = ENV['deploy_path'] || "c:/some_path"

task :all do |t, args|
    puts deploy_path.inspect
end

И вызвать с:

nicholas@hal:/tmp$ rake
(in /tmp)
"c:/some_path"

Или, чтобы переопределить путь:

nicholas@hal:/tmp$ rake deploy_path=c:/other_path
(in /tmp)
"c:/other_path"
0 голосов
/ 12 августа 2010

в основном, вы называете свои аргументы как дополнительные символы после названия задачи.параметр args будет передан в блок, который отвечает на имя ваших аргументов, и вы можете вызвать задачу, передав аргументы в квадратных скобках ([])

ree-1.8.7-2010.02@rails3 matt@Zion:~/setup$ cat lib/tasks/blah.rake 
task :blah, :n do |t, args|
  puts args.n
end
ree-1.8.7-2010.02@rails3 matt@Zion:~/setup$ rake blah[20]
(in /home/matt/setup)
20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...