【问题标题】:Why is this Albacore task, defined in a class, not working?为什么这个在类中定义的 Albacore 任务不起作用?
【发布时间】:2010-11-25 01:18:03
【问题描述】:

我把这个类放在一起,但它并不能真正运行构建。我插入了一些其他日志记录,没有出现任何错误。我声明自己是 Ruby 的菜鸟,所以希望一些可爱的 Ruby 专家能发现我遇到的任何愚蠢的错误!

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。

我已经看到长鳍金枪鱼的工作并意识到它的力量,只需要希望我的技能得到一点磨练

【问题讨论】:

    标签: ruby rake albacore


    【解决方案1】:

    您调用的 msbuild 方法永远不会执行,因为 Albacore 是一套 rake 任务,而 msbuild 是希望通过 rake 执行的任务之一,而不是直接在另一种方法中执行,尽管它可以做完了。

    do |msb| ... end 块内调用 msb.execute 不会执行任务,因为在执行 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 的场景。

    【讨论】:

    • 这看起来会很有帮助!我会尽快测试它。 Derick 在这个项目上做得很好,给了我进入 Ruby 的好垫脚石。
    • 你在这里得到了我的帮助!!我试图鼓励代码重用,所以我可能会选择 2,但会考虑尝试达到 1 的情况。非常有帮助,如前所述,继续努力。
    猜你喜欢
    • 2011-03-12
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多