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

时间:2012-09-13 20:09:50

标签: 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>

使用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)

此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>

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

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:3)

尝试在* .nuspec文件中定义文件部分,在VS属性中为它们设置复制Copy to Output Directory属性为Copy alwaysCopy if newer。之后,所有编译的文件和nuspec都将在$(OutputPath)中。然后将AfterBuild更改为:

<Target Name="AfterBuild">
  <PropertyGroup>
    <NuspecPath>$([System.IO.Path]::Combine($(OutputPath), "$(ProjectName).nuspec"))</NuspecPath>
  </PropertyGroup>
  <!-- package with NuGet -->
  <Exec WorkingDirectory="$(BaseDir)" Command="$(NuGetExePath) pack $(NuspecPath) -Verbose -OutputDirectory $(OutDir) -Symbols -Prop Configuration=$(Configuration)" />
</Target>