Rad*_* M. 20 versioning msbuild
我希望能够在构建期间将所有程序集的版本号指定为MSBuild命令参数,如下所示:
MSBuild.exe /p:version=5.4.3.0
Run Code Online (Sandbox Code Playgroud)
我已经看过了,AssemblyInfoTask但在这种情况下我似乎不是一个好的解决方案.
Yar*_*rik 30
对于使用 构建的 SDK 样式项目dotnet.exe,程序集版本属性会自动生成,因此您可以立即使用/p:Version=5.4.3.0。
如果您使用旧的项目格式,则需要将以下BeforeBuild步骤添加到您的.csproj文件中。无需使用 extra.targets和 extension packs,因为 MSBuild 已经有一个很好的内置任务,它可以完成大部分工作:
<Target Name="BeforeBuild">
<ItemGroup>
<AssemblyAttributes Include="AssemblyVersion">
<_Parameter1>$(Version)</_Parameter1>
</AssemblyAttributes>
</ItemGroup>
<MakeDir Directories="$(IntermediateOutputPath)" />
<WriteCodeFragment Language="C#"
OutputFile="$(IntermediateOutputPath)Version.cs"
AssemblyAttributes="@(AssemblyAttributes)" />
<ItemGroup>
<Compile Include="$(IntermediateOutputPath)Version.cs" />
</ItemGroup>
</Target>
Run Code Online (Sandbox Code Playgroud)
只需确保删除现有AssemblyVersion属性,因为它现在将在构建期间生成。
2020 年 7 月 29 日更新:
迈克尔·帕克 (Michael Parker ) 指出,如果您使用这种方法并从 Visual Studio 进行构建,您最终会在Version.cs文件中得到一个空版本。为了克服这个问题,我建议在您的.csproj文件中定义默认的 Version 值,如下所示:
<PropertyGroup>
...
<Version Condition="'$(Version)' == ''">1.0.0.0</Version>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
1.0.0.0如果没有在命令行中指定版本,这会将其设置为。
Dav*_*veE 16
我在您的评论中一直使用AssemblyInfo任务.
<!-- update standard assembly attribute in all projects -->
<Target Name="BeforeBuild" >
<Message Text="Updating AssemblyInfo to Version $(VersionNumber)"></Message>
<Message Text="Writing to AssemblyInfo files in $(SolutionRoot)"></Message>
<AssemblyInfo AssemblyInfoFiles="@(AssemblyInfoFiles)"
AssemblyCopyright="$(AssemblyCopyright)"
AssemblyVersion="$(VersionNumber)"
AssemblyFileVersion="$(VersionNumber)"
>
</AssemblyInfo>
</Target>
Run Code Online (Sandbox Code Playgroud)
VersionNumber值完全按照您的描述从MSBuild项目文件外部传递:
MSBuild <project_file> /p:VersionNumber=<value>;...
Run Code Online (Sandbox Code Playgroud)
我们使用BeforeBuild目标来确保AssemblyInfo.cs文件在构建开始之前都得到了处理.这不是你想要的吗?
Jac*_*ach 16
我知道这是一个老问题,但谷歌引导我到这里作为最佳结果.
我跟着一个简单的解决这个.无需扩展包.
基本上你需要做的是添加一个"BuildCommon.targets"文件并相应地修改你的csproj文件,以便在msbuild中指定版本号,如:
msbuild.exe abc.sln /p:Configuration=Release;VersionAssembly=1.2.3.4
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
最上面的答案很好,但我需要做一些调整。我们有一个包含 SDK 和非 SDK 项目混合的解决方案。此外,我们还用于AspNetCompileMerge预编译 ASP.NET MVC 5 视图。使用属性名称会导致fromAssemblyAttributes的目标被执行并失败。所以我最终达到了整个解决方案共享的以下目标:GenerateAssemblyInfoAspNetCompileMerge.targetsDirectory.Build.props
<PropertyGroup>
<Version Condition="'$(Version)' == ''">1.0.0.0</Version>
<AssemblyVersion Condition="'$(AssemblyVersion)' == ''">$(Version.Split('-')[0])</AssemblyVersion>
<FileVersion Condition="'$(FileVersion)' == ''">$(Version.Split('-')[0])</FileVersion>
<InformationalVersion Condition="'$(InformationalVersion)' == ''">$(Version)</InformationalVersion>
</PropertyGroup>
<Target Name="NonSdkGenerateAssemblyInfo" DependsOnTargets="PrepareForBuild" BeforeTargets="BeforeBuild" Condition="('$(UsingMicrosoftNETSdk)' != 'True' And '$(GenerateAssemblyInfo)' != 'False')">
<ItemGroup>
<NonSdkAssemblyAttributes Include="AssemblyVersion">
<_Parameter1>$(AssemblyVersion)</_Parameter1>
</NonSdkAssemblyAttributes>
<NonSdkAssemblyAttributes Include="AssemblyFileVersion">
<_Parameter1>$(FileVersion)</_Parameter1>
</NonSdkAssemblyAttributes>
<NonSdkAssemblyAttributes Include="AssemblyInformationalVersion">
<_Parameter1>$(InformationalVersion)</_Parameter1>
</NonSdkAssemblyAttributes>
</ItemGroup>
<WriteCodeFragment AssemblyAttributes="@(NonSdkAssemblyAttributes)"
Language="C#"
OutputDirectory="$(IntermediateOutputPath)"
OutputFile="AssemblyInfo.cs">
<Output TaskParameter="OutputFile" ItemName="Compile" />
<Output TaskParameter="OutputFile" ItemName="FileWrites" />
</WriteCodeFragment>
</Target>
Run Code Online (Sandbox Code Playgroud)
如果需要,您可以添加其他属性。默认版本号是1.0.0.0,您可以在命令行上指定其他版本号,模仿 SDK 行为:
AssemblyVersion并默认为不带后缀FileVersion的值。$(Version)例如,如果$(Version)是1.2.3-beta.4,则该值将为1.2.3。InformationalVersion默认为 的值$(Version)。| 归档时间: |
|
| 查看次数: |
27716 次 |
| 最近记录: |