7

今天我遇到了一个有趣的问题,我的测试在构建机器上一直失败,而它们在我的机器上运行良好,即使使用相同的配置。当我查看 Assert.AreEqual 在故障转储中输出的差异时,我看不出有什么不同。经过大量调查,我发现测试用例源代码中的逐字字符串(跨越多行)在我的机器上使用 CRLF,但在构建机器上使用 LF,导致将该字符串与生成的字符串进行比较字符串失败。罪魁祸首是两个系统上的 Git 设置不一致,构建系统会自动将 CRLF 序列转换为 LF。

C# 规范是否说明了如何解释逐字字符串中的换行符(可能使用 Environment.Newline,或者至少是一致的)?这似乎是一个问题,可能会以非常难以诊断和难以修复的方式困扰很多人,尤其是对于 .NET Standard。例如,如果您有一个 .NET Standard 项目,并且在 Linux 和 Windows 上都有团队成员,那么这可能会影响 Linux 团队成员或 Windows 团队成员。

4

2 回答 2

4

规范通过不解决它来解决这个问题:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/lexical-structure

在逐字字符串文字中,分隔符之间的字符被逐字解释,唯一的例外是quote_escape_sequence

由于行尾没有例外,因此您将获得源文件中使用的任何行尾。正如你所发现的。

于 2018-01-10T22:12:46.767 回答
0

这个基于 Git 帮助文档的解决方案可以帮助确保一致性,无论每个 Git 实例的设置如何。

根据https://help.github.com/articles/dealing-with-line-endings/中的文档

或者,您可以通过配置一个特殊的 .gitattributes 文件来配置 Git 在每个存储库的基础上管理行尾的方式。该文件被提交到存储库并覆盖个人的 core.autocrlf 设置,确保所有用户的行为一致,无论他们的 Git 设置如何。

于 2018-01-10T22:56:23.923 回答