2013-05-10 51 views
2

考慮從.sln文件下面的代碼片段:是否可以將.sln文件中的屬性傳遞給MSBuild中的項目文件?

... 
# 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文件傳遞到項目文件,以便我可以實現這一點?

或者:還有其他方法可以實現嗎?

回答

0

我不認爲你可以從.sln文件傳遞屬性,因爲MSBuild實際上可以使用XML文件!

我能想到的是寫一個自定義的MSBuild任務,並從.sln文件讀取想要的數值。

+0

定製任務如何知道哪個解決方案從哪裏跑? – 2013-05-10 22:09:52

+2

當建立一個SLN(或的msbuild vstudio),這些預定義的宏可用:SolutionDir,SolutionExt,SolutionFileName,解決方案名稱,SolutionPath。你可以通過使用詳細的'詳細'的msbuild構建任何sln來輕鬆地找到這些。 – scobi 2013-12-03 16:54:13

0

可以重新利用任一配置或平臺屬性,其可以在溶液中的下拉進行設定,或者使用斯科特Bilas的所提及的性質中的一種。

我被劫持了$(配置)領域,但現在由於斯科特的評論:

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

我猜你可能會有兩種方式,和你的條件下使用出現的聲音。

0

我對構建後事件有同樣的需求。我在VS2015中使用了以下解決方案。

您可以定義在MainApp.csproj屬性的標籤的PropertyGroup裏,像這樣:

<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'" 
相關問題