NuGet pack和msbuild-如何在其他位置打包引用程序集?

NuGet pack和msbuild-如何在其他位置打包引用程序集?,msbuild,nuget,Msbuild,Nuget,我第一次使用NuGet pack,使用.csproj文件中的后构建目标 <Target Name="AfterBuild"> <!-- package with NuGet --> <Exec WorkingDirectory="$(BaseDir)" Command="$(NuGetExePath) pack -Verbose -OutputDirectory $(OutDir) -Symbols -Prop Configuration=$(Configu

我第一次使用NuGet pack,使用.csproj文件中的后构建目标

<Target Name="AfterBuild">
  <!-- package with NuGet -->
  <Exec WorkingDirectory="$(BaseDir)" Command="$(NuGetExePath) pack -Verbose -OutputDirectory $(OutDir) -Symbols -Prop Configuration=$(Configuration)" />
</Target>
此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>

$(MSBuildProjectDirectory)\src
$(MSBuildProjectDirectory)\build\$(配置)

既然构建将程序集重定向到构建目录,那么当我运行pack时,NuGet找不到它们。如何让NuGet在生成目录中查找程序集?

尝试在*.nuspec文件中定义文件部分,在VS属性中将复制
copy to Output directory
属性设置为
copy always
copy 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>

$([System.IO.Path]::合并($(OutputPath),“$(ProjectName.nuspec”))

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


我确实让它这样工作,但它失去了使用.csproj替换令牌的惯例。我也添加了一个答案,你认为它比较好吗?在这种情况下,你的解决方案看起来更好,绝对正确。我忘了换代币了。但除了关于codeplex的一些讨论之外,我没有找到关于TargetPath属性的文档。它在任何地方都有文档记录吗?没有很好的文档记录,我想我通过codeplex、一些博客文章、nuget目标文件和源代码找到了它。
<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>