繁体   English   中英

在MSBuild和Visual Studio中为引用的项目修改DefineConstants

[英]Modify DefineConstants for referenced project in MSBuild and Visual Studio

我有一个Windows Phone类库项目BaseProj和几个引用该项目,项目AB等的WP项目的解决方案。BaseProj具有LocationHelper类。

可以说项目A需要BaseProj才能与LocationHelper类一起编译,但是项目B的构建应不具有ID_CAP_LOCATION能力,因此在构建BaseProj时不应包括LocationHelper类。

我可以使用条件编译符号来实现这一点,问题是:如何根据要构建的项目AB来使用适当的符号来构建BaseProj

经过研究,我提出了以下解决方案,在BaseProj.csproj中,我添加了

<PropertyGroup Condition=" '$(TestProperty)'==true ">
  <DefineConstants>$(DefineConstants);TEST_SYMBOL</DefineConstants>
</PropertyGroup>

在B.csproj中,ProjectReference中的一个属性是:

<ProjectReference Include="..\BaseProj\BaseProj.csproj">
  <Project>{...}</Project>
  <Name>BaseProj</Name>
  <Properties>TestProperty=true</Properties>
</ProjectReference>

认为在使用B而不是A进行构建时应添加TEST_SYMBOL 当我使用MSBuild进行构建时,这可以很好地工作。 另一方面,Visual Studio完全忽略了这一点,这意味着调试和使用构建脚本进行发布构建时,我会得到不同的行为。

如何从MSBuild Visual Studio中获得所需的行为?

我想出了一个适用于MSBuild和Visual Studio的新解决方案。

首先,如果定义了条件编译符号INCLUDE_LOCATION_API则将BaseProj设置为使用位置api构建。

项目AB设置为使用执行Powershell脚本pre-build.ps1的pre-build事件进行构建。 (请参阅此问题 )。

pre-build.ps1将读取当前项目的清单,以确定其是否具有定位功能( ID_CAP_LOCATION ),以及BaseProj Debug和Release配置是否定义了INCLUDE_LOCATION_API 如有必要,将添加或删除INCLUDE_LOCATION_API 由于这将修改BaseProj.csproj ,因此构建脚本将退出并显示错误代码,以防止构建完成。

当我从VS构建时,如果BaseProj具有正确的配置,它将正常构建。 如果配置错误,则会修改BaseProj.csproj ,并且构建失败,但是下一个构建将成功。

在构建脚本中,我在实际构建之前执行一次pre-build.ps1 ,以确保项目具有正确的配置。 然后,将执行MSBuild,并成功构建项目。

我不会考虑这种最佳实践,但是它可以完成工作,并且我不需要考虑在项目之间切换时应该使用什么配置。

这可以通过定义新的项目配置来完成。 假设您已经具有调试和发布配置,并且已使用ID_CAP_LOCATION配置它们,则可以创建新配置,例如:Debug_No_Location和Release_No_Location。 这是在Visual Studio的“配置管理器”对话框中完成的。 除项目配置外,还定义相应的解决方案配置,以使其更容易从Visual Studio进行构建。 之后,从Debug_No_Location / Release_No_Location配置中删除ID_CAP_LOCATION。

在解决方案中编辑所有项目,并确保“中间位置”和“二进制文件”位置与它们的“调试/发布”配置不同是很重要的,否则,您将遇到在配置之间混合二进制文件的问题,从而使增量构建不可靠。

如果要从VS IDE构建两种版本(带位置和不带位置),则必须手动在配置之间切换。 但是,您可以从命令行创建两次调用MSBuild.exe的简单脚本。 例如:

msbuild MySolution.sln /p:Configuration=Debug
msbuild MySolution.sln /p:Configuration=Debug_No_Location

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM