有some opensource project,应该在Windows和Linux上构建。在Linux上它应该以不同的方式构建,我想在.csproj包含的C#源中使用LINUX预处理器常量,即
#if !LINUX
// windows specific code (some TFS integration)
#else
// linux specific code (absence of TFS integration)
#endif
但在Windows和Linux版本中使用相同的.csproj,我不能像这样在.csproj中为项目设置添加define(因为这个定义对两个平台都有效):
- <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <DefineConstants>DEBUG;TRACE;LINUX</DefineConstants>
可以再创建2个单独的配置,并从命令行将配置名称传递给msbuild。但这违反了DRY原则(配置重复,无需这样做)。
可以在构建期间自动确定操作系统,而不是从外部传递此信息。
人们建议我创建并包含脚本(例如operating_system.targets,或者应该是operating_system.props?)并在项目中使用它,如下所示:
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" />
+ <Import Project="$(SolutionDir)\operating_system.targets" />
例如,有几种方法可以确定操作系统 http://www.mono-project.com/docs/faq/technical/#how-to-detect-the-execution-platform
if (Type.GetType("Mono.Runtime") != null)
IsMono = true; // we're on Mono
else
IsMono = false;
int p = (int) Environment.OSVersion.Platform;
if ((p == 4) || (p == 6) || (p == 128)) {
IsUnix = true; // we're on Unix
} else {
IsUnix = false;
}
public static bool IsLinux
{
get {
bool isLinux = System.IO.Path.DirectorySeparatorChar == '/';
return isLinux;
}
}
还有 __ MonoCS __ 定义 - 请参阅How can I conditionally compile my C# for Mono vs. Microsoft .NET? (我不能只使用__MonoCS__,因为它将在Windows上使用单声道编译器进行编译时定义)
所以,我想要一个operating_system.targets文件的例子,它将在Linux上编译项目时为C#代码定义LINUX常量。