构建整个解决方案,但仅为一个项目添加全局条件编译符号

Posted

技术标签:

【中文标题】构建整个解决方案,但仅为一个项目添加全局条件编译符号【英文标题】:Build entire solution but add global Conditional Compilation Symbols for just one project 【发布时间】:2011-01-25 11:47:52 【问题描述】:

我有一个相当复杂的解决方案,除了测试项目外,还包含 10 个项目。 它是一个使用远程通信的分布式应用程序和服务网络;因此,拥有正确引用的程序集(和版本)至关重要。这就是为什么我希望在 ONE 构建中编译和 schrink-wrap 整个东西。

其中一个应用程序是一个演示/分析工具,它根据用户的输入运行另一个更大的应用程序的子进程并显示结果;这样,工程师就有了一个工具来帮助调整他们的“大计算”设置。显然,该子流程包含在另一个程序集中,并且呈现给工程师的大部分结果是由

#if ENABLE_TRACE_MATCHING
Trace.WriteLine("Some engineering output");
#endif

我的问题是项目设置中的条件编译符号仅限于该项目的程序集,并且不会传播到引用的程序集。 我如何配置我的构建,使所有项目都将在 未定义 ENABLE_TRACE_MATCHING 的情况下构建,除了一个调试/分析应用程序项目,其中所有引用的项目/程序集都必须使用 ENABLE_TRACE_MATCHING 进行编译 被定义

我也不能用#if DEBUG 替换#if ENABLE_TRACE_MATCHING,因为这会导致我们的工程师不知道如何处理的大量不同输出。

提前致谢。

PS:如果您认为我的代码有异味,那么我同意。另外:这主要不是我的代码;)

【问题讨论】:

我忘了说:都是 C# 和 .NET 3.5 【参考方案1】:

您需要了解有关 Microsoft Build 的更多信息,这是一个开箱即用的 Microsoft .NET 工具,出现在任何框架的安装中。

使用 MSBuild,您可以定义这些“符号”(属性)和一批命令(目标)。

您可以创建一个 MSBuild 脚本,从解决方案中的所有项目导入默认 Visual Studio 目标,并在脚本中声明这些属性(“符号”)。

实际上,设置此类符号的属性已经存在:“DefineConstants”。

因此,既然您拥有它,您就可以拥有提供该属性值的 MSBuild 脚本,并在那里重新声明它,因此,所有 MSBuild 目标都将了解这些符号。

编辑: 也检查这个其他问题: msbuild, defining Conditional Compilation Symbols

【讨论】:

以上是关于构建整个解决方案,但仅为一个项目添加全局条件编译符号的主要内容,如果未能解决你的问题,请参考以下文章

尽管在正则表达式中使用了全局修饰符,但仅返回一项

如何仅为列表中的项目子集提供披露按钮?

Mongoose:批量更新插入,但仅在满足某些条件时才更新记录

2020-2-22

在 Visual Studio 2013 中完成整个编译后是不是可以运行构建后事件?

仅为 QTabWidget 中的选项卡显示工具提示,而不是整个小部件