【问题标题】:Automatically change the version of only assembly which has code changes in Dot Net自动更改仅在 Dot Net 中有代码更改的程序集的版本
【发布时间】:2020-08-15 07:26:29
【问题描述】:

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

【问题讨论】:

    标签: visual-studio msbuild .net-assembly automatic-differentiation assemblyversions


    【解决方案1】:

    那么当我构建我的应用程序时有什么办法吗?它应该改变 只有 A、B、C 和 D 库的版本有变化。手动我 可以改变,但我需要任何自动方式。

    其实Directory Build.targets文件大概可以实现。当您创建一个名为 Directory.Build.targets 的文件时,它可以搜索并作用于当前文件夹和下属中的所有项目。请参阅this document 了解其搜索范围。 Directory Build.targets 很像 Directory Build.propsDirectory Build.targets 在构建之后执行,而Directory Build.props 在构建开始之前执行。

    在你的情况,你想覆盖属性Version,你应该使用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全选项目-->卸载项目,然后重新加载需要的项目并修改,以防其他不相关的项目项目已修改。

    或者尝试将这些需要的项目放入解决方案文件夹(存在xxx.sln文件)下名为Modified Projects的新文件夹,然后将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>
    

    并确保&lt;GeneratePackageOnBuild&gt;true&lt;/GeneratePackageOnBuild&gt;Directory.Build.targets 中。否则会失败。所以请在xxx.csorj文件中删除这个节点,并在Directory.Build.targets中添加&lt;GeneratePackageOnBuild&gt;true&lt;/GeneratePackageOnBuild&gt;

    【讨论】:

    • @Perry Qian 据我了解,这又是手动过程。我必须在构建中仅包含更改的项目。但是我需要一些自动过程来跟踪项目 A 是否发生更改,然后它应该更改 A 的版本以及引用项目 A 的项目 D。
    • 其实Directory Build.targets相当于一个自动化脚本。它会影响你当前目录或二级目录下的所有项目,并且当你的项目发生变化时,它会在构建时自动更改版本号。所以我的步骤是创建这样的自动化脚本,你可以试试。
    • 嘿@Perry,当我使用msbuild 构建.sln 文件时,您能否帮我提供任何适用的示例。所以我可以清楚你提到的想法。
    • 如果它有效,请随时告诉我们。
    • 我进行了更改并运行了 msbuild,但仍然没有更改。它显示了我使用 msbuild 从命令行设置的版本号。我给你一个简单的例子。在应用程序中,我有 3 个解决方案名称(SolA、SolB、SolC),并且我的通用库名称为 Common.lib。在 SolA 中作为 AWindowsService 的应用程序名称和在 SolB 中作为 BWinForm 的应用程序名称都使用这个 Commob.lib 程序集。现在我在 Common.lib 中进行了更改,然后它应该只更改 Common.lib、AWindowService 和 BWinForm proejct 的版本和其他 lib 和项目它应该设置我从 Msbuild 设置的版本。
    猜你喜欢
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 2011-08-02
    • 2017-03-27
    相关资源
    最近更新 更多