共享AssemblyInfo,用于整个解决方案的统一版本控制

lys*_*cid 68 .net c# visual-studio-2010 .net-assembly visual-studio

我已经读过这个技术:http://blogs.msdn.com/b/jjameson/archive/2009/04/03/shared-assembly-info-in-visual-studio-projects.aspx

基本上,它意味着创建一个SharedAssemblyInfo.cs,其中包含有关程序集的版本信息,并将此文件添加为解决方案的所有项目的链接,因此实际文件仅驻留在磁盘上的1个位置.

我的问题涉及两个场景:

  1. 不使用此机制的现有解决方案:有没有办法轻松地将ShareAssemblyInfo添加到所有项目?(假设我有50个项目的解决方案).

  2. 创建新项目时,默认情况下会创建一个新的AssemblyInfo.cs.但是,我想自动链接到SharedAssemblyInfo.

这有什么解决方案吗?常见的做法是什么?

Sim*_*wsi 59

可以链接到VS 2010中的共享程序集信息文件.Ashish Jain有一篇关于它的好文章:在解决方案中跨项目共享程序集版本.

在解决方案级别创建共享程序集信息文件后,他从项目链接到它的说明是:

  1. 右键单击要添加共享程序集文件的项目,然后选择Add - > Existing Item ...

  2. 从解决方案文件夹中选择文件"SharedAssemblyInfo.cs".

  3. 而不是添加,单击添加旁边的箭头,然后单击"添加为链接"

  4. 在同一文件夹中向下拖动添加的链接文件和AssemblyInfo.cs.

  5. 对要为其添加共享程序集文件的所有项目重复步骤1 - 4.

我试过这个并且它有效.

  • 无需重复步骤1-4.您可以将链接文件从第一个项目拖到下一个项目.这会将链接文件复制到下一个项目. (9认同)
  • 感谢您解释我忽略的小箭头! (4认同)
  • 您也可以通过替换所有* .csproj文件中的文本来实现。更新一个项目并比较新旧csproj文件中的结果,然后将其应用于解决方案中的所有其他项目;) (2认同)

Iva*_*lov 52

第一点可以通过简单的文本编辑器解决,该编辑器可以同时处理多个文件并查找/替换.只需在其中打开所有csproj并替换<Compile Include="Properties\AssemblyInfo.cs" />

<Compile Include="..\SharedAssemblyInfo.cs">
  <Link>Properties\SharedAssemblyInfo.cs</Link>
</Compile>
Run Code Online (Sandbox Code Playgroud)

或者你可以写一个这样的实用程序:

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);
}
Run Code Online (Sandbox Code Playgroud)

至于第二个问题......你可以看一下Visual Studio自定义项目模板,但我不确定它值得努力.您应该IMO编写测试来检查这一点.它会更简单,结果实际上几乎相同.

UPD:关于编写用于根据某些自定义规则检查解决方案/项目文件的测试.基本上,sln/csproj格式很简单,无需太多努力即可解析.因此,如果您想要SharedAssemblyInfo.cs链接到每个项目 - 只需解析csproj并检查它.然后将该检查器放在构建服务器中并在每个构建上运行它.我们目前有这样的系统工作,它花费了大约两天的时间来编写,但为我们节省了更多(我们有更复杂的规则和多解决方案项目,所以值得努力).

我现在不会在这里详细介绍这个检查(它不是那么简短),但我很快就会写博客文章 - 很可能直到本周末.所以,如果你有兴趣 - 请尽快查看我的博客 :)

UPD: 在这里.