2017-08-08 13 views
0

新しいmsbuild csproj形式には、統合されたnugetコマンドがあります。プロジェクトファイル内のコマンド<RestoreOutputPath>obj\profile7</RestoreOutputPath>を使用して、プロジェクト資産が復元されるデフォルトパスを変更することができます。MSBuild nuget RestoreOutputPathどのように動作させるには?

しかし、私は、ファイル後件コマンドcsprojする<RestoreOutputPath>obj\profile7</RestoreOutputPath>を追加した場合

dotnet restore myproj.sln 
dotnet build myproj.sln 

は、ビルドコマンド中にこのobj\Profile7パスからnuget資産を取得するためのMSBuildを伝えるためにどのようにエラー

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

を構築する生産?

答えて

2

復元出力パスはMSBuildProjectExtensionsPathと同じである必要があります。これにより、生成されたナゲットとターゲットファイルが共通の小道具とターゲットによってインポートされます。パスをProjectAssetsFileに設定する場合のデフォルトはBaseIntermediateOutputPathです。

は、少なくともNuGetの輸入のために、SDK小道具ファイルがインポートされMSBuildProjectExtensionsPathまたはBaseIntermediateOutputPathが設定されていることが重要です。

これらの問題をすべて解決する最も簡単な方法は、すべてのコンポーネントがデフォルトのベースパスとしてその値をとるように、プロジェクトの早い段階で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)artifacts \ obj \ $(MSBuildProjectName)'のように設定して、プロジェクトごとに一意のパスを取得することができます異なるパスの下で同じ名前)。 –

関連する問題