通过 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" />
那你就可以实现了,方便多了。
希望对你有帮助。