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

Posted

技术标签:

【中文标题】共享 AssemblyInfo 用于跨解决方案的统一版本控制【英文标题】:Shared AssemblyInfo for uniform versioning across the solution 【发布时间】:2011-07-21 05:37:46 【问题描述】:

我已经阅读过这种技术:Shared assembly info in VS projects - JJameson's blog

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

我的问题涉及两种情况:

    不使用此机制的现有解决方案:有没有一种方法可以轻松地将 ShareAssemblyInfo 添加到所有项目中? (假设我有一个包含 50 个项目的解决方案)。

    创建新项目时,默认情况下会创建一个新的 AssemblyInfo.cs。不过我也想自动链接到 SharedAssemblyInfo。

有什么解决办法吗?常见的做法是什么?

【问题讨论】:

通常的做法是创建唯一的程序集信息 【参考方案1】:

可以链接到 VS 2010 中的共享程序集信息文件。Ashish Jain 有一篇很好的博客文章:Sharing assembly version across projects in a solution。

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

    右键单击要在其中添加共享的项目 组装文件,然后选择 Add -> Existing Item...

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

    不是添加,而是单击添加旁边的箭头,然后单击“添加为 链接”

    在 AssemblyInfo.cs 旁边向下拖动添加的链接文件 同一个文件夹。

    对您希望为其添加共享的所有项目重复步骤 1 - 4 汇编文件。

我试过了,效果很好。

【讨论】:

感谢您解释我忽略的小箭头! 无需重复步骤 1-4。您可以将链接的文件从您的第一个项目拖到下一个项目。这会将链接文件复制到下一个项目。 您也可以通过替换所有 *.csproj 文件中的文本来实现。更新一个项目并比较新旧 csproj 文件中的结果,并将其应用于解决方案中的所有其他项目;) 这是一个比接受的答案更好的答案。由于实现起来非常简单,因此应该在 Visual Studio 中构建这样的东西。【参考方案2】:

第一点可以通过简单的文本编辑器来解决,该编辑器可以一次处理多个文件并查找/替换。只需在其中打开所有 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 custom project templates ,但我不确定这是否值得。您应该 IMO 编写测试来检查它。它会简单得多,结果实际上几乎相同。

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

我现在不会在这里详细写此检查(它不是那么短),但我将很快写一篇关于它的博客文章 - 最有可能直到本周末。所以,如果您有兴趣 - 请尽快查看my blog :)

UPD: Here 是。

【讨论】:

#1 - 我同意这可以用文本编辑器完成。我想知道VS本身是否以某种方式支持这一点。 (顺便说一句 - 在你看来 EditPad Pro 比 Notepad++ 更好吗?)#2 - 你写一个测试来检查这个是什么意思? 是的,EditPad Pro 是更好的 IMO。至少当我上次检查 N++ 时肯定会更好。它也不是免费软件,所以您应该认为自己是否需要它。 我已经用你的第二点的一些细节更新了答案。【参考方案3】:

我创建了一个应用程序来自动增加文件版本。

    下载Applicaiton 将以下行添加到预构建事件命令行

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

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

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

【讨论】:

【参考方案4】:

这不适用于同时具有 C# 和 F# 项目的解决方案。 c# 项目不能引用共享的 f# 文件,反之亦然。

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

【讨论】:

以上是关于共享 AssemblyInfo 用于跨解决方案的统一版本控制的主要内容,如果未能解决你的问题,请参考以下文章

跨线程共享内存访问

ini 示例Nginx配置,用于为反向代理API添加跨源资源共享(CORS)支持

ini 示例Nginx配置,用于为反向代理API添加跨源资源共享(CORS)支持

ini 示例Nginx配置,用于为反向代理API添加跨源资源共享(CORS)支持

ini 示例Nginx配置,用于为反向代理API添加跨源资源共享(CORS)支持

ini 示例Nginx配置,用于为反向代理API添加跨源资源共享(CORS)支持