通过 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。
我正在寻找一种方法来执行以下操作:
命令行
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。