NuGet包和msbuild - 如何在其他位置打包参考组件?

Rya*_*anW 7 msbuild nuget

我是第一次使用NuGet包,使用.csproj文件中的AfterBuild目标.

<Target Name="AfterBuild">
  <!-- package with NuGet -->
  <Exec WorkingDirectory="$(BaseDir)" Command="$(NuGetExePath) pack -Verbose -OutputDirectory $(OutDir) -Symbols -Prop Configuration=$(Configuration)" />
</Target>
Run Code Online (Sandbox Code Playgroud)

使用msbuild("msbuild MyProj.csproj")构建项目时,这很好.NuGet能够在projectdir/bin/Release或projectdir/bin/Debug中找到已编译的程序集.

但是,该项目是解决方案中的众多项目之一,并且有一个专用于构建整个解决方案的构建文件.目录树是这样的:

- project root
  - build
  - src
    - MyProj
      - MyProj.csproj
      - MyProj.nuspec
    - AnotherProj
      - AnotherProj.csproj
      - AnotherProj.nuspec
  - project.proj (msbuild file)
Run Code Online (Sandbox Code Playgroud)

此msbuild文件将覆盖Visual Studio构建的输出路径.

<PropertyGroup>
  <CodeFolder>$(MSBuildProjectDirectory)\src</CodeFolder>
  <CodeOutputFolder>$(MSBuildProjectDirectory)\build\$(Configuration)</CodeOutputFolder>
</PropertyGroup>

<Target Name="Build" DependsOnTargets="CleanSolution">
  <Message Text="============= Building Solution =============" />
  <Message Text="$(OutputPath)" />
  <Message Text="$(BuildTargets)" />
  <MsBuild Projects="$(CodeFolder)\$(SolutionName)" 
           Targets="$(BuildTargets)"
                 Properties="Configuration=$(Configuration);RunCodeAnalysis=$(RunCodeAnalysis);OutDir=$(OutputPath);" />
</Target>
Run Code Online (Sandbox Code Playgroud)

现在构建将程序集重定向到构建目录,当我运行pack时,NuGet无法找到它们.如何让NuGet在build目录中找到程序集?

Rya*_*anW 15

为NuGet提供一个TargetPath属性,以便在哪里找到程序集.

<Target Name="AfterBuild" Condition="'$(Configuration)' == 'Release' ">
  <!-- package with NuGet -->
  <Exec WorkingDirectory="$(BaseDir)" Command="$(NuGetExePath) pack -OutputDirectory $(OutDir) -Symbols -Prop Configuration=$(Configuration);TargetPath=$(OutDir)$(AssemblyName)$(TargetExt)" />
</Target>
Run Code Online (Sandbox Code Playgroud)