C# dotnet core/csproj中的AssemblyInfo具有来自目标的属性

C# dotnet core/csproj中的AssemblyInfo具有来自目标的属性,c#,msbuild,mercurial,csproj,assemblyinfo,C#,Msbuild,Mercurial,Csproj,Assemblyinfo,我正在尝试使用编译日期时间和mercurial修订版自动生成的程序集信息设置csproj <!-- assembly info --> <PropertyGroup> <!-- versioning number: Maj.Min.TimeStamp.Rev --> <Major>2</Major> <Minor>90</Minor> <!-- define Buil

我正在尝试使用编译日期时间和mercurial修订版自动生成的程序集信息设置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
$([System.DateTime]::Now.ToString(`yy`)$([System.DateTime]::Now.DayOfYear.ToString(`000`))
0
$(主要)。$(次要)。$(构建)
$(主要)。$(次要)。$(构建)。$(修订版)
$(主要)。$(次要)。$(构建)。$(修订版)
在控制台输出上,我得到了一致的结果:2.90.20160.239 但是只有$(Build)在tmp AssemblyInfo.cs中正确使用,$(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>

AAA
BBB
2.
90
0
0
你能找到解决这个问题的方法吗

新测试:

  <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>

$(主要)。$(次要)。$(构建)。$(修订版)
亲切问候,,
Charles

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

属性类似于字符串到字符串的字典,因此
Version
和其他属性将被设置为字符串值,并在字符串中计算$()替换,但在逻辑上不保留


这意味着一旦目标运行,您还需要更新现在需要再次更改的所有属性(
Version
AssemblyVersion
FileVersion
等)。您可以通过在
HgVersion
任务调用之后在目标内部添加
来完成此操作。

在开始运行实际构建逻辑(由目标组成)之前,将对项目文件的静态部分(除
之外的所有内容)进行完全评估

属性类似于字符串到字符串的字典,因此
Version
和其他属性将被设置为字符串值,并在字符串中计算$()替换,但在逻辑上不保留


这意味着一旦目标运行,您还需要更新现在需要再次更改的所有属性(
Version
AssemblyVersion
FileVersion
等)。您可以通过在
HgVersion
任务调用后在目标内部添加
来完成此操作。

您好,感谢您对csproj文件静态/动态部分的反馈和解释。我对问题进行了编辑,以提供以前工作正常的内容。有了新的csproj格式,我想也许有些东西可以优化。例如,AssemblyInfo.cs是自动生成的。但是现在社区组装信息任务应该没有必要了。。此外,MSBuild.Mercurial导入看起来很奇怪,因为PackageReference样式的nuget引用应该自动包含它。但是,在目标中重新定义版本/assemblyversion/fileversion是否可以修复它?好的,请理解,回到代码上后,我们将尝试一下,thks!嗨,我在问题的末尾加了“新测试”部分。从输出控制台:>建议编号:2.90.20176.242>之前的组装版本:2.90.20176.0>之后的组装版本:2.90.20176.242但来自obj\Debug\net472的tmp AssemblyInfo.cs忽略新的组装版本..您好,感谢您对csproj文件静态/动态部分的反馈和解释。我对问题进行了编辑,以提供以前工作正常的内容。有了新的csproj格式,我想也许有些东西可以优化。例如,AssemblyInfo.cs是自动生成的。但是现在社区组装信息任务应该没有必要了。。此外,MSBuild.Mercurial导入看起来很奇怪,因为PackageReference样式的nuget引用应该自动包含它。但是,在目标中重新定义版本/assemblyversion/fileversion是否可以修复它?好的,请理解,回到代码上后,我们将尝试一下,thks!嗨,我在问题的末尾加了“新测试”部分。从输出控制台:>建议编号:2.90.20176.242>之前的组装版本:2.90.20176.0>之后的组装版本:2.90.20176.242但来自obj\Debug\net472的tmp AssemblyInfo.cs忽略新的组装版本。。