[英]Modify DefineConstants for referenced project in MSBuild and Visual Studio
我有一个Windows Phone类库项目BaseProj和几个引用该项目,项目A , B等的WP项目的解决方案。BaseProj具有LocationHelper类。
可以说项目A需要BaseProj才能与LocationHelper类一起编译,但是项目B的构建应不具有ID_CAP_LOCATION能力,因此在构建BaseProj时不应包括LocationHelper类。
我可以使用条件编译符号来实现这一点,问题是:如何根据要构建的项目A或B来使用适当的符号来构建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构建。
项目A和B设置为使用执行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.