自动更改仅在 Dot Net 中有代码更改的程序集的版本

Automatically change the version of only assembly which has code changes in Dot Net

我正在为我的应用程序创建补丁,以便为客户部署小的更改。在我的应用程序中,我有 100 个 .CSProject。在 100 个库中,我对 class 库 A、B、C 和库 D 调用 A、B 和 C 库进行了代码更改。那么,当我构建我的应用程序时,有没有什么办法应该只更改有更改的 A、B、C 和 D 库的版本。我可以手动更改,但我需要任何自动方式。

So Is there any way when I build my application then It should change the version of only A,B,C and D library which have changes. Manually I can change but I need any automatic way.

其实Directory Build.targets文件大概可以实现。当你创建一个名为Directory.Build.targets的文件时,它可以搜索和操作当前文件夹及其下属的所有项目。请参阅 this document 了解其搜索范围。 Directory Build.targetsDirectory Build.props 非常相似。 Directory Build.targets 在构建之后执行,而 Directory Build.props 在构建开始之前执行。

在你的情况下,你想覆盖属性 版本,你应该使用Directory Build.targets

然后 当您构建项目时,它会自动将内容放入项目范围内。

解决方案

1)在你的解决方案或100个项目的上层目录下创建一个名为Directory Build.targets的文件

2) 将这些添加到 Directory Build.targets 文件中:

<Target Name="change_property" AfterTargets="CoreCompile">
<PropertyGroup>
<Version>xxxxx</Version>
</PropertyGroup>
</Target>

3) 然后您可以将所有更改的项目版本设置为您希望的相同版本。

并且此函数对所有更改的项目进行相同的 属性 更改。

你应该注意它有一个缺陷

但是你不应该修改其他相关的项目(代码更改或添加新项目,图片或其他任何东西)如果你改变不相关的项目,这个功能也会改变不相关的版本项目。这是 CoreCompile 目标的特殊功能。

建议

因此,注意不要修改其他项目或者可以用Alt+A select所有项目-->卸载项目,然后reload required项目并修改它们以防任何其他不相关的项目被修改。

或者尝试把这些需要的项目放到解决方案文件夹下一个名为Modified Projects的新文件夹中(里面有xxx.sln文件),然后把Directory Build.targets 进入 Modified Projects 文件夹。

-----------------使用其他类似的方法可以避免这种情况。

更新 1

1) 如果您的项目在同一个解决方案文件夹中,那么您可以创建一个名为 Directory.Build.targets.

的文件

它将处理当前文件夹及其二级目录中的所有项目。

并在此文件中添加我的示例代码:

<Project>
<Target Name="change_property" AfterTargets="CoreCompile">
    <PropertyGroup>
    <Version>xxxxx</Version>
    </PropertyGroup>
    </Target>
</Project>

然后你可以修改你的nuget项目,当你完成你的相关项目时,你可以构建你的解决方案或使用MSBuild.exe到build xxx.sln,这个文件将自动执行并改变修改后的 nuget 项目的版本。

希望它能对您有所帮助,并期待任何其他反馈。

更新 2

请尝试更改为在 Directory.Build.targets 中使用,它将在整个解决方案下工作以应用于每个 verison 号码。

 <Project>
    <Target Name="change_property" AfterTargets="CoreCompile">
        <PropertyGroup>
        <Version>xxxxx</Version>
        </PropertyGroup>
        </Target>
    </Project>
<PropertyGroup>
        <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    </PropertyGroup>

并确保 <GeneratePackageOnBuild>true</GeneratePackageOnBuild>Directory.Build.targets 中。否则会失败。所以请在 xxx.csorj 文件中删除此节点并在 Directory.Build.targets.

中添加 <GeneratePackageOnBuild>true</GeneratePackageOnBuild>