在MSBuild中将程序集版本号指定为命令行参数

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如果没有在命令行中指定版本,这会将其设置为。

  • 自我提醒:不要忘记.Net Framework 项目也可以有 SDK 样式的项目文件! (2认同)
  • 正如我刚刚了解到的那样,应在 **`&lt;Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /&gt;` 行之后指定 `&lt;Target Name="BeforeBuild"&gt;` (2认同)

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文件在构建开始之前都得到了处理.这不是你想要的吗?

  • 当我尝试此操作时,我收到一条错误消息,指出未找到 AssemblyInfo 任务。我在 google 上搜索了“AssemblyInfo 任务”并安装了该名称的东西作为 MSBuild 扩展,但这没有用。你能提供一个你正在使用的链接吗? (2认同)
  • 你们其中一个人可以在GitHub上提供一个最小的工作示例吗? (2认同)

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)

希望这可以帮助.

  • 现在是2019年...这仍然是设置某些版本号的最简单解决方案... Microsoft,请解决此问题。 (3认同)
  • 他们做到了,对于 dotnet.exe,您可以像您想要的那样指定`/p:Version=1.2.4` (3认同)

Bou*_*uke 7

最上面的答案很好,但我需要做一些调整。我们有一个包含 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)