使用*的AssemblyVersion失败并显示错误“通配符与确定性不兼容?”

99

我无法在汇编版本中使用 *,这样做会导致以下编译错误:

指定的版本字符串包含通配符,这与确定性不兼容。请从版本字符串中删除通配符,或者禁用此次编译的确定性。

SCRAssembly


3
针对 .NET Core 项目,/deterministic 编译选项需要手动编辑 .csproj 文件来关闭。请注意,该版本要比非确定性版本更差,因为修订号将是当天的时间。因此,版本号可能会倒退或重复,建议最好不要使用版本号。 - Hans Passant
9
请始终将错误信息(和代码)作为文本发布,而不是作为图像。 - H H
1
@HansPassant 默认版本是日期和时间的组合,所以除非时空连续性出现问题,否则默认的构建号和修订版本将会不断增加。(我发现有时候可以用来确定构建时间)。 - undefined
你说的是"1.0.*",但他们并没有使用这个版本。 - undefined
4个回答

107

.csproj文件的<PropertyGroup>中,添加具有false值的<Deterministic>标签,并在AssemblyVersion的第三部分使用*

<PropertyGroup>
 <Deterministic>false</Deterministic>
 <AssemblyVersion>x.x.*</AssemblyVersion>
</PropertyGroup>
<PropertyGroup>
    <ProduceReferenceAssembly>true</ProduceReferenceAssembly>
    <Version>1.0.0</Version>
    <AssemblyVersion>1.0.*</AssemblyVersion>
    <Deterministic>false</Deterministic>
</PropertyGroup>

"确定性"的意思是 - 如果没有发生变化,编译器将使用相同版本的文件,从而提高构建速度。

AssemblyVersion中使用通配符的应该是AssemblyVersion(而不是AssemblyFileVersion)。如果您在AssemblyVersion中提供了通配符,请根本不要包含AssemblyFileVersion


还要注意:有两种形式。一种是在第三个位置上放置星号(x.y.*),另一种是在第四个位置上放置星号(x.y.z.*)。

x.y.*自动生成BUILD和REVISION数字。BUILD是“自2000年1月1日以来的天数”,因此每天只会更改一次。而REVISION是“自00:00以来的秒数的一半”。

例如,今天'1.0.*'AssemblyVersion将生成一个特定的'7472',例如'1.0.7472.20737'。最后的5位数字每次构建时都会有所不同(至少如果有更改)。

1.0.0.*相比,这可能更好地支持,因为它表示年龄(.7300将近6个月)。例如1.0.7472.20737表示“此程序集是在2020年6月16日上午11:31:14构建的”。


似乎这对于VS Pro 2019不起作用。它只会创建一个带有错误exe的ref文件夹。 - user1853517

77

我猜您之前可以使用它,但现在不能用了。

原因 - Visual Studio 有了一些变化,新的项目文件现在默认为“确定性”属性为“True”。

解决方案 - 正如 Hans Passant 所说,通过手动编辑项目文件来解决。缺点就像他所说的那样。

具体地,编辑 .csproj 文件将 <Deterministic>false</Deterministic>

来源 - https://marinovdh.wordpress.com/2018/10/22/68/


这并没有解决我的VS2022(17.6.2)上的问题。仍然出现错误,指定的版本不符合推荐的格式。 - benzhi
这并没有解决我的VS2022(17.6.2)上的问题。仍然收到错误提示,指定的版本不符合推荐的格式。 - undefined

4

VS2019可以自动生成一个.editorconfig文件,并将严格程度设置为“建议(suggest)”,其内容如下:

[*.cs]

    # CS7035: The specified version string does not conform to the recommended format - major.minor.build.revision
    dotnet_diagnostic.CS7035.severity = suggestion

enter image description here


2
我发现了一个很酷的解决方案,适用于 .Net Core 项目,这为 @Hans 的评论提供了启示。
<PropertyGroup>
        <TargetFramework>net6.0</TargetFramework>
        <VersionSuffix>1.$([System.DateTime]::UtcNow.ToString(yyMM)).$([System.DateTime]::UtcNow.ToString(ddhh)).$([System.DateTime]::UtcNow.ToString(mmss))</VersionSuffix>
        <AssemblyVersion Condition=" '$(VersionSuffix)' == '' ">1.0.0.1</AssemblyVersion>
        <AssemblyVersion Condition=" '$(VersionSuffix)' != '' ">$(VersionSuffix)</AssemblyVersion>
        <Version Condition=" '$(VersionSuffix)' == '' ">1.0.0.1</Version>
        <Version Condition=" '$(VersionSuffix)' != '' ">$(VersionSuffix)</Version>
        <!--Deterministic tells the compiler to use the same versions of the files if no changes have happened resulting in faster builds-->
        <Deterministic>false</Deterministic>

参考:https://sachabarbs.wordpress.com/2020/02/23/net-core-standard-auto-incrementing-versioning/

这篇文章介绍了如何在.NET Core项目中进行版本控制。通过使用MSBuild任务和Git标记来实现自动增量版本号的生成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接