ProjectC中的MSBuild条件引用基于是运行ProjectA还是ProjectB

时间:2015-06-06 15:37:42

标签: visual-studio msbuild xamarin-studio

我的解决方案中有三个项目:

ProjectA : contains reference to ProjectC
ProjectB : contains reference to ProjectC
ProjectC : references third.party.dll.A or third.party.dll.B

在编译期间,我希望Project C引用 third.party.dll.A third.party.dll.B ,具体取决于ProjectA或ProjectB中的哪一个我已经设置为启动项目,并通过IDE启动/编译。

如何设置我的解决方案以便我可以在ProjectC.csproj中使用MSBuild条件引用来确定ProjectA或ProjectB当前是否正在编译?

(在.csproj文件中,我尝试检查$(DefineConstants)是否包含某个值,但似乎$(DefineConstants)只包含ProjectC中定义的符号,而不包含ProjectA和ProjectB中定义的符号。)

(仅供参考:我在Mac上使用Xamarin Studio。但我认为如果有办法让Visual Studio工作,它也适用于Xamarin Studio。)

1 个答案:

答案 0 :(得分:0)

不,你不能这样做。 MSBuild中的项目引用不能配置为您希望它们的扩展,引用项目的构建配置在标准的msbuild .targets文件中进行了硬编码。

您的案例有几种可能的解决方法。最简单的方法是创建两个项目:ProjectC1ProjectC2。 C1将使用第三方库之一,而C2将使用另一个。您可以使ProjectC1ProjectC2共享相同的源文件,因此不会出现代码重复。

另一种可行的解决方法是使用条件赋值引用third.party.dll.Athird.party.dll.B,如下所示:

<ItemGroup>
  <ProjectReference Condition="'$(BuildA)' == 'true'" Include="pathto\third.party.dll.A">
    <Name>third.party.dll.A</Name>
  </ProjectReference>
  <ProjectReference Condition="'$(BuildB)' == 'true'" Include="pathto\third.party.dll.B">
    <Name>third.party.dll.B</Name>
  </ProjectReference>
</ItemGroup>

如果这样做,你还应该为构建输出目录设置类似的条件,根据属性BuildA和BuildB的值,你应该将$(IntDir)和$(OutDir)配置为分开位置,因为你的增量构建将是严重破坏了。

然后,您可以从命令行构建传递其他参数:

> msbuild ProjectA.csproj /p:BuildA=true

> msbuild ProjectB.csproj /p:BuildB=true

要在Visual Studio或Xamarin Studio中使构建工作正常,您必须在启动VS或XS之前设置环境变量。请注意,如果不重新启动VS或XS,则无法从一种配置切换到另一种配置。