如何使用Rake / Albacore为每个项目应用单独的AssemblyInfo版本?

时间:2014-02-20 18:27:25

标签: .net ruby rake versioning albacore

我有一个包含多个项目的解决方案。一个请求是为每个项目提供不同的版本。我以为我有一个解决方案,但不太了解ruby我不知道如何解决它或为什么会发生这种情况。以下是我的rakefile的相关部分:

projects = ["ProjectOne", "ProjectTwo"]

assemblyinfo :assemblyinfo do |asm|
   projects.each do | proj |
      bumper_file proj + "/VERSION"
      asm.version = bumper_version.to_s
      asm.file_version = bumper_version.to_s

      asm.product_name = proj
      asm.output_file = proj + "/Properties/AssemblyInfo.cs"
   end
end

一切都很好,但每个项目都会获得列表中第一个项目的版本。有趣的是,如果我稍微改变它:

projects.each do | proj |
   bumper_file proj + "/VERSION"
   assemblyinfo :assemblyinfo do |asm|
      asm.version = bumper_version.to_s
      asm.file_version = bumper_version.to_s

      asm.product_name = proj
      asm.output_file = proj + "/Properties/AssemblyInfo.cs"
   end
end

然后,每个项目都会获取列表中最后一个文件的版本。如何将版本设置为每个项目中VERSION文件中的版本?

1 个答案:

答案 0 :(得分:0)

因此,如果我正确地阅读了您的问题,那么您有两个项目,每个项目在某个项目特定的子文件夹中都有一个单独的VERSION文件。像这样......

my-project/
  source/
    projectA/
      Properties/
        AssemblyInfo.cs
      VERSION
    projectB/
      Properties/
        AssemblyInfo.cs
      VERSION

你想要一个Rake / Albacore任务,将正确的版本应用于每个项目。您构建第一个任务的方式是,您只创建一个任务,并且您正在覆盖使用该循环分配给它的属性!

assemblyinfo :assemblyinfo do |asm|  #=> one :version task
  projects.each do |proj|            #=> many iterations
    # ... assignment ...             #=> overwriting properties
  end
end

第二个任务定义,即“轻微调整”,实际上是偶然的。您每次通过项目循环定义整个任务,但名称相同。这就是你可能没有意识到的一个鲜为人知的Rake功能......具有相同名称的任务会相互附加。所以,你实际上是用一个名字和不同的身体做两个任务。

projects.each do |proj|                #=> many iterations
  assemblyinfo :assemblyinfo do |asm|  #=> many tasks mapped to the same name
    # ... assignment ...               #=> separate properties
  end
end

为了使事情更清楚,我建议在每个assemblyinfo任务获得自己唯一名称的任务定义中,然后构建一个依赖于所有任务的version任务。

projects.each do |proj|
  name = File.join(proj, "Properties/AssemblyInfo.cs")
  bumper_file = File.join(proj, "VERSION")

  assemblyinfo name do |asm|
    asm.output_file = asm
    asm.version = asm.file_version = bumper_version.to_s
    asm.product_name = proj
  end
end

desc "Version every project in the solution"
task :version => projects.map { |proj| File.join(proj, "Properties/AssemblyInfo.cs") }