【问题标题】:AssemblyInfo in dotnet core/csproj with Property from Targetdotnet core/csproj 中的 AssemblyInfo 与 Target 中的属性
【发布时间】:2023-04-08 01:04:01
【问题描述】:

我正在尝试使用从编译日期时间和可变修订自动生成的程序集信息来设置一个 csproj。

  <!-- assembly info -->
  <PropertyGroup>
    <!-- versioning number: Maj.Min.TimeStamp.Rev -->
    <Major>2</Major>
    <Minor>90</Minor>
    <!-- define Build based on the compilation date: yyddd that sould be integer in [0..65535] -->
    <Build>$([System.DateTime]::Now.ToString(`yy`))$([System.DateTime]::Now.DayOfYear.ToString(`000`))</Build>
    <Revision>0</Revision>
    <Version>$(Major).$(Minor).$(Build)</Version>
    <AssemblyVersion>$(Major).$(Minor).$(Build).$(Revision)</AssemblyVersion>
    <FileVersion>$(Major).$(Minor).$(Build).$(Revision)</FileVersion>
  </PropertyGroup>

  <Import Project="..\packages\MSBuild.Mercurial.1.2.1\build\MSBuild.Mercurial.targets" Condition="Exists('..\packages\MSBuild.Mercurial.1.2.1\build\MSBuild.Mercurial.targets')" />
  <Target Name="GetHgRev" BeforeTargets="GenerateAssemblyInfo" DependsOnTargets="PrepareForBuild">
    <HgVersion LocalPath="$(SolutionDir)" Timeout="5000">
      <Output TaskParameter="Revision" PropertyName="Revision" />
    </HgVersion>
    <Message Text="Last revision from HG: $(Revision)" Importance="High" />
    <Message Text="$(Major).$(Minor).$(Build).$(Revision)" Importance="High" />
  </Target>

在控制台输出上,我得到了一致的结果:2.90.20160.239 但是在 tmp AssemblyInfo.cs 中只有 $(Build) 正确使用,$(Revision) 基本为 0。

在之前的 csproj 格式 (2015) 中,我在 BeforeBuild 目标中使用显式 cmd 完成了工作:

  <PropertyGroup>
    <AssemblyCompany>AAA</AssemblyCompany>
    <MyAppName>BBB</MyAppName>
    <Major>2</Major>
    <Minor>90</Minor>
    <Build>0</Build>
    <Revision>0</Revision>
  </PropertyGroup>
  <Target Name="BeforeBuild">
    <!-- get the Mercurial revision no -->
    <HgVersion LocalPath="$(SolutionDir)" Timeout="5000">
      <Output TaskParameter="Revision" PropertyName="Revision" />
    </HgVersion>
    <Message Text="Last revision from HG: $(Revision), today date $([System.DateTime]::Now.ToString(`yyyy.MM.dd`)) -&gt; $([System.DateTime]::Now.ToString(`yy`))$([System.DateTime]::Now.DayOfYear.ToString(`000`))" Importance="High" />
    <!-- define Build based on the compilation date: yyddd that sould be integer in [0..65535] -->
    <CreateProperty Value="$([System.DateTime]::Now.ToString(`yy`))$([System.DateTime]::Now.DayOfYear.ToString(`000`))">
      <Output PropertyName="Build" TaskParameter="Value" />
    </CreateProperty>
    <!-- generate version file, i.e. AssemblyInfo.cs used later for compilation -->
    <Message Text="Creating Version File: $(Major).$(Minor).$(Build).$(Revision)" Importance="High" />
    <AssemblyInfo CodeLanguage="CS" OutputFile=".\Properties\AssemblyInfo.cs" AssemblyTitle="AAA" AssemblyDescription="BBB" AssemblyCompany="$(AssemblyCompany)" AssemblyProduct="CCC" AssemblyCopyright="Copyright © DDD $([System.DateTime]::Now.ToString(`yyyy`))" AssemblyVersion="$(Major).$(Minor).$(Build).$(Revision)" AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" />
  </Target>

您会看到任何解决此问题的方法吗?

新测试:

  <Import Project="..\packages\MSBuild.Mercurial.1.2.1\build\MSBuild.Mercurial.targets" Condition="Exists('..\packages\MSBuild.Mercurial.1.2.1\build\MSBuild.Mercurial.targets')" />
  <Target Name="GetHgRev" BeforeTargets="GenerateAssemblyInfo" DependsOnTargets="PrepareForBuild">
    <HgVersion LocalPath="$(SolutionDir)" Timeout="5000">
      <Output TaskParameter="Revision" PropertyName="Revision" />
    </HgVersion>
    <Message Text="Proposed number: $(Major).$(Minor).$(Build).$(Revision)" Importance="High" />
    <Message Text="AssemblyVersion before: $(AssemblyVersion)" Importance="High" />
    <PropertyGroup>
      <AssemblyVersion>$(Major).$(Minor).$(Build).$(Revision)</AssemblyVersion>
    </PropertyGroup>
    <Message Text="AssemblyVersion after: $(AssemblyVersion)" Importance="High" />
  </Target>

亲切的问候, 查尔斯

【问题讨论】:

    标签: c# msbuild mercurial csproj assemblyinfo


    【解决方案1】:

    项目文件的静态部分(&lt;Target&gt; 之外的所有内容)在开始运行实际构建逻辑(由目标组成)之前被完全评估。

    属性就像一个字符串到字符串的字典,因此Version 和其他属性将被设置为字符串值,而 $() 替换在字符串中被评估但不被逻辑保留。

    这意味着一旦目标运行,您还需要更新现在需要再次更改的所有属性(Version、AssemblyVersion、FileVersion 等)。您可以通过在HgVersion 任务调用之后在目标内添加&lt;PropertyGroup&gt; 来实现。

    【讨论】:

    • 您好,感谢您对 csproj 文件的静态/动态部分的反馈和解释。我编辑了这个问题以提供之前工作正常的内容。使用新的 csproj 格式,我认为也许可以优化一些东西。例如。 AssemblyInfo.cs 是自动生成的。但是现在
    • 社区 AssemblyInfo 任务不应该是必要的。MSBuild.Mercurial 导入似乎很奇怪,因为 PackageReference 样式的 nuget 引用应该自动包含它。但是重新定义目标中的版本/程序集版本/文件版本是否可以解决问题?
    • 好的,明白了,回代码试试,谢谢!
    • 您好,我在问题末尾添加了“新测试”部分。从输出控制台:>建议编号:2.90.20176.242 >AssemblyVersion before:2.90.20176.0 >AssemblyVersion after:2.90.20176.242
    • 但是来自 obj\Debug\net472 的 tmp AssemblyInfo.cs 忽略了新的 AssemblyVersion..
    猜你喜欢
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    相关资源
    最近更新 更多