为什么在课堂上定义的Albacore任务不起作用?

时间:2010-11-25 01:18:04

标签: ruby rake albacore

我将这个类放在一起,但它实际上不能运行构建。我插入了一些其他日志记录,没有出现任何错误。我在Ruby上宣称自己是一个菜鸟,所以希望一些可爱的Ruby Expert可以发现我有任何愚蠢的错误!

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
      msb.execute
    end
  end
end

我也尝试过使用:build而不是:compile。

我见过长鳍金枪鱼工作并意识到它的力量,只需要让我的技能有点磨练

1 个答案:

答案 0 :(得分:4)

您正在调用的msbuild方法永远不会执行,因为Albacore是一套rake任务,而msbuild是其中一个想要由rake执行的任务,而不是直接在另一个方法中执行虽然可以做到。

msb.execute块内调用do |msb| ... end将不会执行任务,因为在执行rake任务本身之前不会评估此块。

你有一些选择让它工作。选项#1是Albacore的推荐和预期用途。我强烈建议使用rake和Albacore,因为它们本来是要使用的,所以你以后不会遇到问题。选项#2和#3现在可以使用,但是对rake或Albacore API的更改可能会在不事先通知的情况下破坏它们。当然,你可以随心所欲地使用它们。

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运行,通过从命令行调用rake,与rakefile.rb在同一文件夹中

2。使用Task[:compile].execute在您的方法中执行任务。

由于msbuild调用是rake任务而不是立即执行代码的标准方法,因此必须手动执行在幕后创建的任务。这将使您现有的代码工作,但这并不是推荐使用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'

    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的唯一方案。