我的解决方案中有三个项目:
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。)
答案 0 :(得分:0)
不,你不能这样做。 MSBuild中的项目引用不能配置为您希望它们的扩展,引用项目的构建配置在标准的msbuild .targets文件中进行了硬编码。
您的案例有几种可能的解决方法。最简单的方法是创建两个项目:ProjectC1
和ProjectC2
。 C1将使用第三方库之一,而C2将使用另一个。您可以使ProjectC1
和ProjectC2
共享相同的源文件,因此不会出现代码重复。
另一种可行的解决方法是使用条件赋值引用third.party.dll.A
和third.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,则无法从一种配置切换到另一种配置。