MSBuild 条件编译

Posted

技术标签:

【中文标题】MSBuild 条件编译【英文标题】:MSBuild Conditional Compilation 【发布时间】:2008-11-17 16:54:16 【问题描述】:

我有一个 web 服务类,框架的其余部分依赖它来获取它的数据,但是 web 服务类需要有不同的方法属性,具体取决于它所处的环境。例如...

[SoapDocumentMethodAttribute("https://example",...)]
public string Test()

    //doSomething

看到“https://example”了吗?这需要根据环境进行更改。 AFAIK,您不能使该字符串在运行时动态,它必须以这种方式编译。所以我试图得到它,以便我有多个用于此 Web 服务的 CS 文件,这些文件中硬编码了不同的属性 URL,并且 MSBuild 在预编译时交换它们。所以我有一个用于测试的基础“Service.cs”,用于生产环境的“Service.cs.production”等等。

这是执行此操作的最佳方式,还是我错过了可以让一个 CS 自行处理环境的东西? 为了保持具有相同的类名并且 IntelliSense 不会认为事情是模棱两可的,我正在修改文件扩展名(“Service.cs”与“Service.cs.production”)。这是唯一的方法吗? 考虑到上述所有情况都可以,而且我正在针对“生产”配置进行编译,它是否可以编译 Service.cs.production 而不是 Service.cs 并且一切顺利?

谢谢!

【问题讨论】:

【参考方案1】:

你可以使用条件 cmets 吗?

#if TESTING
        [SoapDocumentMethodAttribute(something)]
#else
        [SoapDocumentMethodAttribute(someotherthing)]
#endif

对于您的测试配置,您将定义常量:

<DefineConstants>TESTING</DefineConstants>

【讨论】:

【参考方案2】:

结合定义常量,并使用#if 指令,

您还可以编写自定义构建任务 -> Target BeforeBuild,然后在 Project 对象中使用 Engine.GlobalEngine.GetLoadedProject("projpath")。

现在您可以根据需要在不同的环境中操作 Project 对象的属性。

如果需要,请考虑在配置中添加平台,以适应不同的环境。

这可能不是您要寻找的答案,但是当您想要基于项目环境进行 fork 构建时需要考虑的问题。

【讨论】:

以上是关于MSBuild 条件编译的主要内容,如果未能解决你的问题,请参考以下文章

您可以从 msbuild.exe 命令行关闭条件编译符号吗?

Xamarin 形式;条件编译符号在 MSBUILD 命令行中不起作用

Docs-VisualStudio-MSBuild-MSBuild参考:MSBuild 条件

从思路开始 Java如何实现条件编译的技巧

参数值中的 msbuild 任务条件运算符

怎样使用 MSBuild 自动编译和发布 NET 网站