今天我遇到了一个有趣的问题,我的测试在构建机器上一直失败,即使使用相同的配置它们在我的机器上工作得很好。当我在故障转储中查看Assert.AreEqual输出的差异时,我看不出有什么不同。经过一系列调查后,我发现测试用例源代码中的逐字字符串(跨越多行)在我的机器上使用CRLF,但在构建机器上使用LF,导致该字符串与生成的比较字符串失败。罪魁祸首证明两个系统上的Git设置不一致,构建系统自动将CRLF序列转换为LF。
C#规范是否说明了如何解释逐字字符串中的换行符(可能使用Environment.Newline,或者至少是一致的)?这似乎是一个问题,可能会让很多人难以诊断并且难以修复,尤其是.NET Standard。例如,如果您有一个.NET Standard项目,并且在Linux和Windows上都有团队成员,那么很可能会咬住Linux团队成员或Windows团队成员。
答案 0 :(得分:3)
规范通过不解决它来解决这个问题:
在逐字字符串文字中,分隔符之间的字符是逐字解释的,唯一的例外是 quote_escape_sequence 。
由于行结尾没有异常,因此您可以获得源文件中使用的任何行结尾。你发现了。
答案 1 :(得分:0)
这个基于Git帮助文档的解决方案可以帮助确保一致性,无论每个Git实例的设置如何。
根据https://help.github.com/articles/dealing-with-line-endings/
中的文档或者,您可以配置Git管理线路结尾的方式 通过配置特殊的.gitattributes文件来建立每个存储库。 此文件已提交到存储库并覆盖 个人的core.autocrlf设置,确保一致的行为 所有用户,无论他们的Git设置如何。