自动更改仅在 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.targets
与 Directory 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>
我正在为我的应用程序创建补丁,以便为客户部署小的更改。在我的应用程序中,我有 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.targets
与 Directory 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>