MSBuild nuget RestoreOutputPath 如何使其工作?

Ser*_*kov 2 msbuild nuget .net-core .net-core-2.0

新的 msbuild csproj 格式已经集成了 nuget 命令。可以通过<RestoreOutputPath>obj\profile7</RestoreOutputPath>在项目文件中使用命令来更改将恢复项目资产的默认路径 。

但是如果我添加<RestoreOutputPath>obj\profile7</RestoreOutputPath>到 csproj 文件后续命令

dotnet restore myproj.sln
dotnet build myproj.sln
Run Code Online (Sandbox Code Playgroud)

产生构建错误

obj\project.assets.json' not found. Run a NuGet package restore to generate this file.
Run Code Online (Sandbox Code Playgroud)

如何告诉 MSBuildobj\Profile7在构建命令期间从此路径获取 nuget 资产?

Mar*_*ich 8

恢复输出路径需要MSBuildProjectExtensionsPath与 nuget 生成的道具和目标文件相同,以便通用道具和目标导入。以及BaseIntermediateOutputPath将是组合路径的默认值ProjectAssetsFile。

至少对于 NuGet 导入,重要的是在导入 SDK 道具文件之前设置MSBuildProjectExtensionsPath或。BaseIntermediateOutputPath

解决所有这些问题的最简单方法是BaseIntermediateOutputPath在项目的早期进行设置,以便所有组件都将其值作为默认基本路径 - 这实际上是重定向obj到其他地方。

这与<Project SDK="...">语法冲突,因为无法在 SDK 的 props 文件之前设置属性。要解决此问题,可以像这样更改项目:

<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>
Run Code Online (Sandbox Code Playgroud)

另一种方法是创建一个Directory.Build.props文件,该文件将足够早地自动导入,但这会将值应用于目录中的所有项目,并取消为每个项目指定值的能力。