是否可以将属性从.sln文件传递到MSBuild中的项目文件?

时间:2013-05-10 21:31:13

标签: .net msbuild

请考虑.sln文件中的以下代码段:

...
# Visual Studio 2010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MainApp", "MainApp\MainApp.csproj", "{FC66E4A5-0538-47DC-B450-788B98D9461E}"
EndProject
...

以下相应的MainApp.csproj文件片段:

...
<ItemGroup Condition="$(LibAProjRef) == false">
  <Reference Include="LibA, Version=1.0.0.0, Culture=neutral">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\..\Lib\LibA.dll</HintPath>
  </Reference>
</ItemGroup>
<ItemGroup Condition="$(LibAProjRef) == true">
  <ProjectReference Include="..\LibA\LibA.csproj">
    <Project>{2A45F32B-182B-4B8D-A8A4-1BFBF2E81CAD}</Project>
    <Name>LibA</Name>
  </ProjectReference>
</ItemGroup>
...

基本上我在这里尝试做的是创建一个项目文件,它可以使用另一个已经构建的库项目,或者作为项目引用,具体取决于库项目是否存在于解决方案中。

有没有办法将.sln文件中的属性传递给项目文件,以便我可以完成此操作?

或者:有另一种方法可以达到这个目的吗?

3 个答案:

答案 0 :(得分:0)

我认为你不能从.sln文件传递属性,因为MSBuild实际上可以处理XML文件!

我能想到的是编写自定义MSBuild任务,并从.sln文件中读取所需的值。

答案 1 :(得分:0)

您可以重新调整配置或平台属性,可以在解决方案的下拉列表中设置,也可以使用Scott Bilas提到的属性之一。

我正在劫持$(配置)字段,但现在感谢Scott的评论:

<ProjectReference Include="$(SolutionDir)\..\DataLib\DataLib.csproj">

我猜你可以采取任何一种方式,并且你对条件的使用看起来很合理。

答案 2 :(得分:0)

我对构建后事件有同样的需求。我在VS2015中使用了以下解决方案。

您可以在PropertyGroup标记内的MainApp.csproj中定义您的属性,如下所示:

  <PropertyGroup Label="Globals">
        <LibAProjRef>False</LibAProjRef>
  </PropertyGroup>

然后当您构建解决方案时,您可以说

MSBuild "MySln.sln" /m /t:rebuild /p:Configuration=Release /p:Platform=x64 /p:LibAProjRef=True

请注意,这里的属性是字符串,所以你的条件应该是

Condition="'$(LibAProjRef)' == 'True'"