【问题标题】:Set AssemblyInformationalVersion in AssemblyInfo.cs over msbuild Parameters通过 msbuild 参数在 AssemblyInfo.cs 中设置 AssemblyInformationalVersion
【发布时间】:2020-03-17 12:07:19
【问题描述】:

我正在寻找一种方法来做以下事情:

命令行

msbuild myProject.csproj /p:MyInfoText

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

[assembly: AssemblyInformationalVersion($MyInfoText)]

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

问候

【问题讨论】:

标签: c# visual-studio msbuild msbuild-task


【解决方案1】:

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

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

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

解决方案

1) 将一个名为 MSBuildTasks 的 nuget 包安装到您的项目中。

2) 请导入存在于 nuget 包的 lib 文件夹下的MSBuild.Community.Tasks.Targets。对我来说,我将它添加到文件顶部的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) 将 tool 文件夹的内容从 nuget 包中复制到项目中的 newtool 文件夹中。

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

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

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

希望对你有帮助。

【讨论】:

  • 好的谢谢你的回答。我现在有社区任务的解决方案。但是我正在寻找没有这些社区任务块的解决方案。因为我们不想引用第三方库
  • 嘿,谢谢您的建议,但我想我找到了更好的方法。检查我的答案
【解决方案2】:

首先感谢您的 cmets 和答案!

我正在寻找一种方法来设置我的 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>

我通过编写自定义任务解决了我的问题,该任务可以在构建之前添加/替换 AssemblyInfo.cs 中的 AssemblyInformationalVersion。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多