2017-08-08 35 views
0

新的msbuild csproj格式已經集成了nuget命令。通過在項目文件中使用<RestoreOutputPath>obj\profile7</RestoreOutputPath>命令,可以更改要恢復項目資產的默認路徑。MSBuild nuget RestoreOutputPath如何使它工作?

但是如果我添加<RestoreOutputPath>obj\profile7</RestoreOutputPath>到的csproj文件隨之而來的命令

dotnet restore myproj.sln 
dotnet build myproj.sln 

產生編譯錯誤

obj\project.assets.json' not found. Run a NuGet package restore to generate this file. 

如何判斷的MSBuild到構建命令執行過程中該obj\Profile7路徑得到的NuGet資產?

回答

2

還原輸出路徑需要與MSBuildProjectExtensionsPath相同,以便nuget生成的道具和目標文件將由共同的道具和目標導入。以及BaseIntermediateOutputPath將成爲組成ProjectAssetsFile的路徑的默認值。

至少對於NuGet的進口,重要的是MSBuildProjectExtensionsPathBaseIntermediateOutputPath設置爲之前 SDK道具文件被導入。

解決所有這些問題的最簡單方法是在項目的早期階段設置BaseIntermediateOutputPath,以便所有組件都將其值作爲默認基本路徑 - 這實質上是將obj重定向到其他位置。

由於無法在SDK的props文件之前設置屬性,因此與<Project SDK="...">語法衝突。要解決這個問題,該項目可以改變這樣的:

<Project> 
    <!-- This needs to be set before Sdk.props --> 
    <PropertyGroup> 
    <BaseIntermediateOutputPath>obj\SomeSubDir\</BaseIntermediateOutputPath> 
    </PropertyGroup> 

    <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" /> 

    <PropertyGroup> 
    <OutputType>Exe</OutputType> 
    <TargetFramework>netcoreapp1.1</TargetFramework> 
    </PropertyGroup> 

    <!-- other content --> 

    <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" /> 
</Project> 

另一種方法是創建一個Directory.Build.props文件,該文件會被自動導入足夠早,但這將值適用於所有項目在目錄中,拿走指定每個項目價值的能力。

+0

您可以將BaseIntermediateOutputPath設置爲類似於Directory.Build.props中的$(MSBuildThisFileDirectory)構件\ obj \ $(MSBuildProjectName)'以獲取每個項目的唯一路徑(只要您沒有項目不同路徑下的相同名稱)。 –