Почему эта задача Альбакора, определенная в классе, не работает? - PullRequest
3 голосов
/ 25 ноября 2010

Я собрал этот класс, но он фактически не работает, чтобы запустить сборку.Я вставил некоторые другие записи, и никаких ошибок не возникает.Я объявляю себя нубом на Ruby, так что надеюсь, что какой-нибудь прекрасный Ruby Expert сможет распознать любую идиотскую ошибку, которая у меня есть!

Я видел, как работает Альбакор и осознал всю мощь его, просто надо немного отточить свои навыки, надеюсь,

1 Ответ

4 голосов
/ 25 ноября 2010

метод msbuild, который вы вызываете, никогда не выполняется, потому что Albacore - это набор задач rake, а msbuild - это одна из тех задач, которые хотят быть выполнены rake, а не напрямую в другом методе, хотя он можетбыть сделано

Вызов msb.execute внутри блока do |msb| ... end не выполнит задачу, потому что этот блок не оценивается, пока не будет выполнена сама задача rake.

у вас есть несколько вариантовчтобы заставить это работать.Вариант № 1 - рекомендуемое и предполагаемое использование Albacore.Я настоятельно рекомендую использовать грабли и Albacore, так как они предназначены для использования, чтобы в будущем не возникало проблем.Варианты № 2 и № 3 будут работать прямо сейчас, но изменения в API граблей или Albacore могут нарушить их без предварительного уведомления.конечно, вы можете использовать их по своему усмотрению или необходимости.

1.превратите это в скрипт rake вместо класса и метода

# rakefile.rb
require 'albacore'

task :default => [:compile]

msbuild :compile do |msb|
  puts 'running build'
  msb.properties :configuration => :Debug
  msb.targets :Clean, :Build
  msb.solution = build_properties.solution_file_location
end

, а затем запустите его через грабли, вызвав rake из командной строки, в той же папке, что и rakefile.rb

2.используйте Task[:compile].execute для выполнения задачи в вашем методе.

, поскольку вызов msbuild является задачей с граблями, а не стандартным методом, который выполняет его код немедленно, вы должны вручную выполнить задачу, созданную позадисцены.это заставит ваш существующий код работать, но на самом деле это не рекомендуемый способ работы с граблями.

require 'rubygems'
require 'albacore'
require 'albacore/support/albacore_helper'
require 'rake'
require 'rake/tasklib'

class Build_Assembly

  def build(build_properties)
    puts 'doing an assembly build'

    msbuild :compile do |msb|
      puts 'running build'
      msb.properties :configuration => :Debug
      msb.targets :Clean, :Build
      msb.solution = build_properties.solution_file_location
    end

    Task[:compile].execute
  end
end

3.используйте класс MSBuild напрямую, вместо задачи msbuild rake

, если вам действительно нужно вызвать msbuild из метода, тогда вам следует избегать использования задачи msbuild и напрямую вызывать класс MSBuild.это позволяет вам работать непосредственно с кодом, который вы хотите ... больше не нужно использовать rake для вызова чего-то, что вы можете вызвать напрямую

require 'rubygems'
require 'albacore'
require 'albacore/support/albacore_helper'
require 'rake'
require 'rake/tasklib'

class Build_Assembly

  def build(build_properties)
    puts 'doing an assembly build'

    msb = MSBuild.new
    puts 'running build'
    msb.properties :configuration => :Debug
    msb.targets :Clean, :Build
    msb.solution = build_properties.solution_file_location
    msb.execute
  end
end

это единственный сценарий, в котором вам нужно вызывать .execute,вручную.

...