1

我有一个解决方案,其中包含一个 windows phone 类库项目BaseProj和几个引用该项目AB等的 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>

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

如何从 MSBuild和Visual Studio获得我想要的行为?

4

2 回答 2

1

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

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

项目AB设置为使用执行 powershell 脚本pre-build.ps1的预构建事件进行构建。(参考这个问题)。

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

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

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

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

于 2013-09-21T10:08:35.277 回答
0

这可以通过定义新的项目配置来完成。假设您已经有 Debug 和 Release 配置,并且它们配置了 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
于 2013-09-18T03:02:42.153 回答