通过 msbuild 参数在 AssemblyInfo.cs 中设置 AssemblyInformationalVersion

Set AssemblyInformationalVersion in AssemblyInfo.cs over msbuild Parameters

我正在寻找一种方法来执行以下操作:

命令行

msbuild myProject.csproj /p:MyInfoText

在我的 AssemblyInfo.cs 中的 C# 项目中,我会这样做:

[assembly: AssemblyInformationalVersion($MyInfoText)]

我尝试了使用 BeforeBuild 选项的目标,但没有任何效果。有人可以并且愿意提供帮助吗?

问候

Set AssemblyInformationalVersion in AssemblyInfo.cs over msbuild Parameters

首先,你应该注意像$MyInfoText这样的MSBuild属性只能在xxxx.xxproj文件中使用,在你的情况下,它只能被使用在 myProject.csproj 文件而不是 cs 文件中。

实现你的需求,你可以尝试使用target,相当于在MSBuild中重新部署assembly.cs文件中的参数。基于它,您可以从 MSBuild 中的命令行覆盖它的属性。只有 XML 文件中的属性可以被 msbuild 命令行中指定的值覆盖。

解决方案

1) 在您的项目中安装名为 MSBuildTasks 的 nuget 包。

2) 请导入 MSBuild.Community.Tasks.Targets ,它位于 nuget 包的 lib 文件夹下。对我来说,我将它添加到文件顶部的 xxxx.csproj 文件中:

<Import Project="C:\Users\Admin\source\repos\ConsoleApp\packages\MSBuildTasks.1.5.0.235\tools\MSBuild.Community.Tasks.Targets" />

3) 的基础上加上:

<PropertyGroup>
    <ProductName>$(AssemblyName)</ProductName>
    <CompanyName></CompanyName>
    <Version>1.0.0.0</Version>
    <MyInfoText>xxx</MyInfoText>
  </PropertyGroup>
  <ItemGroup>
    <AssemblyVersionFiles Include="$(MSBuildProjectDirectory)\Properties\AssemblyInfo.cs" />
  </ItemGroup>
  <Target Name="AssemblyVersion" Inputs="@(AssemblyVersionFiles)" Outputs="UpdatedAssemblyVersionFiles" BeforeTargets="Build">
    <Attrib Files="%(AssemblyVersionFiles.FullPath)" Normal="true" />
    <AssemblyInfo
      CodeLanguage="CS"
      OutputFile="%(AssemblyVersionFiles.FullPath)"
      AssemblyProduct="$(ProductName)"
      AssemblyTitle="$(ProductName)"
      AssemblyCompany="$(CompanyName)"
      AssemblyCopyright="Copyright $(CompanyName), All rights reserved."
      AssemblyVersion="$(Version)"
      AssemblyFileVersion="$(Version)"
      AssemblyInformationalVersion="$(MyInfoText)">
      <Output TaskParameter="OutputFile" ItemName="UpdatedAssemblyVersionFiles" />
    </AssemblyInfo>
  </Target>

4) 之后可以用msbuild myProject.csproj /p:MyInfoText=xxxxxx覆盖

更新 1

由于您不想安装这个 nuget 包,我建议您可以将它的内容从工具文件夹移动到您的项目中,这样它将成为您项目的一部分。

1) 在您的项目下创建一个名为 newtool 的文件夹

2) 将nuget包中的tool文件夹中的内容复制到项目中的newtool文件夹中

3) 更改为在您的 xxx.csproj 文件中使用此导入标签

 <Import Project="$(ProjectDir)newtool\MSBuild.Community.Tasks.Targets" />

那你就可以实现了,方便多了

希望对您有所帮助。

首先感谢您的评论和回答!

我正在寻找一种方法来设置我的 AssemblyInformationalVersion 属性,我可以通过 msbuild cli 工具进行设置。

我不想使用任何块或第三方库。所以 Community.Tasks 不是一个选项。很明显,我找到了解决这个问题的方法。

现在我的最终解决方案:

我正在查看 Community.Task.Nugget 的工作方式并构建了我自己的解决方案 您可以在您的 csproj 中声明内联任务,您可以在其中编写 C# 代码。

 <UsingTask TaskName="MyCustomTask" TaskFactory="CodeTaskFactory" 
        AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"> //When using .NETCORE use here ...Tasks.Core.dll and change TaskFactory to RoslynTaskFacotry
       <ParameterGroup>
         <MyParam ParameterType="System.String" Required="true" />
       </ParameterGroup>
       <Task>
         <Reference Include="System.Core" />
         <Using Namespace="System" />
         <Code Type="Fragment" Language="cs">
           <![CDATA[
             // My C# Code comes here!
             // You can use your params here with Name like Console.WriteLine(MyParam)
            ]]>
         </Code>
       </Task>
     </UsingTask>

现在您可以像 .csproj 中的普通任务一样使用它

<Target Name="foo">
 <MyCustomTask MyParamter="Test" />
</Target>

我通过编写一个自定义任务解决了我的问题,该任务可以在构建之前 add/replace AssemblyInfo.cs 内的 AssemblyInformationalVersion。