使用解决方案文件的MsBuild和DefineConstants

17

目前,在我的自动化构建中,我使用devenv.exe来构建我的解决方案文件:

devenv /build myproject1.sln

现在,我想创建我的应用程序的两个版本:普通版和轻量版。这两个版本的源代码相同,只是在轻量版中禁用了一些功能,我使用#define lite预处理指令来实现这一点(在csproject文件中,这些常量定义在DefineConstants属性组下)。

在MsBuild或普通devenv构建中,是否可以指定我想要的符号是否存在于构建中?我之所以这样问,是因为我想第一次使用lite预处理指令(轻量版)构建我的文件,第二次则没有lite预处理指令构建(完整版)。

2个回答

33

在您的项目文件中添加一个新的 PropertyGroup 部分,用于轻量版。

<PropertyGroup Condition="'$(LiteVersion)'=='true'">
   <DefineConstants>$(DefineConstants);lite</DefineConstants>
</PropertyGroup>

从所有的DefineConstants的定义中移除lite

MSBuild.exe  myprojeect1.sln
MSBuild.exe  myprojeect1.sln /p:LiteVersion=true

你可以在VS中创建额外的配置来切换版本。但是,如果你忘记向轻量级配置添加标志,就会导致配置不匹配。我可以提供更优雅的解决方案。创建一个.bat文件或更改运行myproject1.sln的链接:

set LiteVersion=true
devenv.exe myproject1.sln

最好将自定义组放在定义调试、发布等常规组之上或之下。 - paulecoyote

2
在您的sln文件中创建两个配置 - 一个用于Lite,另一个用于Normal。在Lite配置中,通过项目属性对话框定义预处理器指令。
然后,在使用devenv.com进行构建时,指定正确的配置来构建。

你想展示一个如何做到这一点的例子吗? - Graviton
2
这对于一个改变配置的属性来说还好,但不适用于多个配置。如果你有两个或更多的配置呢?也许是一个特殊的日志构建。那么你就需要2 * 2 * 2个配置,例如Debug_Lite_Logging - 这一切都变得非常混乱... 我更喜欢Sergio的答案。 - Jon Rea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接