跨解决方案统一版本控制的共享AssemblyInfo

78
我阅读了这个技巧:VS项目中的共享程序集信息 - JJameson's博客 基本上,它意味着创建一个SharedAssemblyInfo.cs文件,其中包含有关程序集的版本信息,并将此文件作为链接添加到解决方案的所有项目中,因此实际文件仅驻留在磁盘上的1个位置。
我的问题涉及2种情况:
  1. 不使用此机制的现有解决方案:是否有一种简便的方法将ShareAssemblyInfo添加到所有项目中? (假设我有一个包含50个项目的解决方案。)
  2. 创建新项目时,默认情况下会创建新的AssemblyInfo.cs。但是我也想自动链接到SharedAssemblyInfo。
有没有解决方案? 什么是常见做法?

常见做法是创建唯一的程序集信息。 - VMAtm
4个回答

72

在VS 2010中,可以将共享的程序集信息文件链接起来。Ashish Jain在他的博客文章中介绍了这个功能:Sharing assembly version across projects in a solution

在解决方案级别创建共享的程序集信息文件后,按照以下步骤将其链接到项目中:

  1. 右键单击想要添加共享程序集文件的项目,选择添加 -> 现有项...

  2. 从解决方案文件夹中选择文件“SharedAssemblyInfo.cs”。

  3. 不要选择添加,点击“添加为链接”旁边的箭头

  4. 将添加的链接文件与同一文件夹中的AssemblyInfo.cs并排拖动。

  5. 对于所有需要添加共享程序集文件的项目,重复执行步骤1-4。

我已经尝试过这个方法,它是可行的。


4
感谢您解释我之前忽略的小箭头! - Brock Hensley
11
无需重复步骤1-4,您只需将链接的文件从第一个项目拖到下一个项目即可。这将把链接文件复制到下一个项目。 - ristaloff
2
你也可以通过替换所有 *.csproj 文件中的文本来完成此操作。更新一个项目并比较新旧 csproj 文件的结果,然后应用于解决方案中的所有其他项目;) - Ludwo
1
这个答案比被采纳的答案好多了。像这样的东西应该内置在Visual Studio中,因为它实现起来非常简单。 - rollsch

55

第一个问题可以通过使用能够同时处理多个文件并进行查找/替换的简单文本编辑器来解决。只需将所有csproj文件都打开,并将字符串<Compile Include="Properties\AssemblyInfo.cs" />替换为

<Compile Include="..\SharedAssemblyInfo.cs">
  <Link>Properties\SharedAssemblyInfo.cs</Link>
</Compile>

或者你可以编写一个类似于这样的实用工具:

var files = Directory.GetFiles(yourSolutionDir, "*.csproj", SearchOption.AllDirectories);
foreach (var f in files) {
  string contents = File.ReadAllText(f);
  string result = contents.Replace("<Compile Include=\"Properties\\AssemblyInfo.cs\" />", putSecondStringHere_ItIsJustTooLong); // :)
  File.WriteAllText(f, contents);
}

至于第二个问题……你可以查看Visual Studio自定义项目模板,但我不确定它是否值得这样做。我认为你应该编写测试来检查它。这样会更简单,而且结果实际上几乎相同。

更新:关于编写用于检查解决方案/项目文件是否符合一些自定义规则的测试。基本上,sln/csproj格式足够简单,可以轻松解析。因此,如果您想将SharedAssemblyInfo.cs链接到每个项目中,只需解析csproj并进行检查即可。然后将该检查器放在构建服务器中,并在每次构建时运行它。我们目前正在使用这样的系统,编写它大约需要两天的时间,但节省了我们更多时间(我们有更复杂的规则和多解决方案项目,所以它值得这样做)。

我现在不会详细介绍此检查(它不是很短),但我打算很快写一篇博客文章——最可能是在本周末之前。因此,如果您感兴趣,请尽快查看我的博客 :)

更新:在这里。


#1 - 我同意这可以用文本编辑器完成。我想知道VS本身是否支持这种方式。(顺便问一下,你认为EditPad Pro比Notepad++更好吗?) #2 - 你所说的编写一个测试来检查这个是什么意思? - lysergic-acid
是的,依我之见,EditPad Pro更好。至少在我上次检查Notepad++时,它确实更好。而且它也不是免费软件,所以你应该自己考虑是否需要它。 - Ivan Danilov
我已经更新了答案,并针对你的第二个观点提供了一些细节。 - Ivan Danilov

0

这种方法不适用于同时包含 C# 和 F# 项目的解决方案。C# 项目无法引用共享的 F# 文件,反之亦然。

在这种情况下,唯一的选择是创建一个单独的项目,并从其他项目中引用它。


0

我已经创建了一个应用程序,可以自动递增文件版本。

  1. 下载 应用程序
  2. 将以下行添加到预生成事件命令行中

C:\temp\IncrementFileVersion.exe $(SolutionDir)\Properties\AssemblyInfo.cs 构建项目 为了保持简单,如果出现错误,该应用程序仅会抛出消息。要确认它正常工作,您需要在“程序集信息”中检查文件版本。

注意:您必须重新加载 Visual Studio 中的解决方案,才能使“程序集信息”按钮填充字段,但您的输出文件将具有更新的版本。

如有建议和请求,请发送电子邮件至 telson_alva@yahoo.com


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接