NuGet恢复PostSharp包在构建开始之前



我正在使用PostSharp,我在我的项目文件中有以下目标描述:

<Target Name="EnsurePostSharpImported" BeforeTargets="BeforeBuild" Condition="'$(PostSharp30Imported)' == ''">
  <Error Condition="!Exists('....packagesPostSharp.3.1.33toolsPostSharp.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://www.postsharp.net/links/nuget-restore." />
  <Error Condition="Exists('....packagesPostSharp.3.1.33toolsPostSharp.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://www.postsharp.net/links/nuget-restore." />
</Target>

据我所知,这是通过NuGet引用PostSharp时添加到项目中的,错误条件检查如下:

  • 第一个错误条件在PostSharp不可用时打破构建(即NuGet没有恢复它成功)。
  • 第二个错误条件当PostSharp在最后一次构建中被NuGet成功恢复时打破构建,但因此不包括在项目中,因此重建是必要的。

BUT,如果我在NuGet.Config.csproj file中有以下配置,第二个错误条件是必要的吗?

NuGet.Config file:

<configuration>
  <packageRestore>
    <!-- Allow NuGet to download missing packages -->
    <add key="enabled" value="True" />
    <!-- Automatically check for missing packages during build in Visual Studio -->
    <add key="automatic" value="True" />
  </packageRestore>
  ...
</configuration>

.csproj file:

<RestorePackages>true</RestorePackages>

据我所知,NuGet会在构建开始之前恢复丢失的包。第二个错误条件将毫无理由地中断构建。

注意:我正在使用Visual Studio 2013和NuGet 2.8。

这取决于恢复的方式以及您安装的NuGet版本。看起来错误消息试图涵盖三种情况:

  1. 在未启用基于MSBuild的包恢复的情况下构建(在Visual Studio中通过右键单击解决方案并选择Enable package restore来配置)。
  2. 基于MSBuild的包恢复未启用时,在Visual Studio之外构建。
  3. 使用旧版本的NuGet在Visual Studio中构建,该版本不支持构建前的自动恢复。

如果你正在使用基于MSBuild的包还原,那么还原将在构建期间发生,此时PostSharp文件将不会被导入,因此$(PostSharp30Imported)将为空,并且将显示第二个错误消息。至少我怀疑情况是这样的。

如果您从命令行构建并且不使用基于MSBuild的包还原,那么如果NuGet包丢失,您将看到第一个错误消息。

如果您没有使用基于MSBuild的包还原,并且正在使用最新版本的NuGet从Visual Studio中构建,那么您是正确的,包将在构建任何内容之前恢复。所以PostSharp导入应该在MSBuild执行之前就可以使用。

由于PostSharp dll在msbuild加载期间是必需的(因此引用该dll的目标在构建期间可用),它们必须在msbuild最终调用时可用。

虽然在VS中点击构建两次是可以接受的,但我在CI环境中使用PostSharp,并且要求在解决方案上调用两次构建是令人沮丧的(第一次构建恢复nugets,但由于错误而构建失败)。

我最终使用了单独的构建步骤:

  1. 恢复nuget包(这将下载PostSharp包并返回成功代码到环境):NuGet.exe restore SolutionWithProjectsUsingPostSharp.sln
  2. 构建解决方案。

您需要在csproj

中编辑目标中的第二个错误条件



存在& lt;错误条件="!("… PostSharp.3.1.33 工具 包PostSharp.targets")"Text="这个项目引用了这台计算机上缺少的NuGet包。启用"NuGet Package Restore"下载。更多信息,请访问http://www.postsharp.net/links/nuget-restore。"/比;
<罢工> & lt;错误条件= "存在("… PostSharp.3.1.33 工具 包PostSharp.targets")"Text="构建恢复的NuGet包。再次构建项目以在构建中包含这些包。更多信息,请访问http://www.postsharp.net/links/nuget-restore。"罢工/祝辞

& lt;/目标>在

我已经在SO的不同帖子中详细回答了

我们正在使用'旧' MSBuild-Integrated package restore (. NuGet NuGet。目标文件存在),并且通常不存储在源代码控制包中,但依赖于构建来为每个构建恢复它们。

但是对于TeamCity构建服务器上的PostSharp,我得到错误:

构建恢复了NuGet包。重新构建项目以包含这些包在构建中。

最简单的方法是在源代码控制包中显式地包含PostSharp.VerXXX.

或者解决方案可以迁移到自动包恢复,
正如在使用PostSharp 3中建议的那样。x with NuGet Auto Restore

右键单击解决方案,管理Nuget包;并删除你不需要的包。

当尝试从web恢复包时,也会出现此错误。只要把你自己连到互联网上,然后试着打开这个项目。

按照上面的步骤,错误消失了。

最新更新