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

时间:2014-05-09 06:24:37

标签: visual-studio msbuild nuget nuget-package postsharp

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

<Target Name="EnsurePostSharpImported" BeforeTargets="BeforeBuild" Condition="'$(PostSharp30Imported)' == ''">
  <Error Condition="!Exists('..\..\packages\PostSharp.3.1.33\tools\PostSharp.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('..\..\packages\PostSharp.3.1.33\tools\PostSharp.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未成功恢复)。
  • 第二个错误条件会在最后一次构建时由NuGet成功恢复PostSharp时中断构建,但因此未包含在项目中,因此需要进行重建。

但是,如果我在NuGet.Config.csproj file中进行了以下配置,那么第二个错误情况是否必要?

NuGet.Config档案

<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档案

<RestorePackages>true</RestorePackages>

据我了解,NuGet将在构建开始之前恢复丢失的包。第二个错误条件基本上会完全打破构建。

注意:我使用的是Visual Studio 2013和NuGet 2.8。

5 个答案:

答案 0 :(得分:4)

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

  1. 在未启用基于MSBuild的程序包还原的情况下构建(通过右键单击解决方案并选择“启用程序包还原”在Visual Studio中配置)。
  2. 未启用基于MSBuild的程序包还原时在Visual Studio外部构建。
  3. 使用旧版本的NuGet使用Visual Studio构建,该版本不支持在构建之前自动恢复。
  4. 如果您正在使用基于MSBuild的程序包还原,则在构建期间将进行还原,此时将不会导入PostSharp文件,因此$(PostSharp30Imported)将为空,并将显示第二条错误消息。至少我怀疑是这样的。

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

    如果您没有使用基于MSBuild的程序包还原,并且正在使用最新版本的NuGet在Visual Studio中构建,那么您在更新任何内容之前将恢复这些程序包是正确的。因此,在甚至执行之前,PostSharp导入应该可供MSBuild使用。

答案 1 :(得分:2)

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

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

我最终得到了单独的构建步骤:

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

答案 2 :(得分:0)

您需要在csproj

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

&lt;目标名称=&#34; EnsurePostSharpImported&#34; BeforeTargets =&#34; BeforeBuild&#34;条件=&#34;&#39; $(PostSharp30Imported)&#39; ==&#39;&#39;&#34;&gt;

  &lt;错误条件=&#34;!存在(&#39; .... \ packages \ PostSharp.3.1.33 \ tools \ PostSharp.targets&#39;)&#34; Text =&#34;此项目引用此计算机上缺少的NuGet包。启用NuGet Package Restore以下载它们。有关详细信息,请参阅http://www.postsharp.net/links/nuget-restore。&#34; /&GT;
  &lt;错误条件=&#34;存在(&#39; .... \ packages \ PostSharp.3.1.33 \ tools \ PostSharp.targets&#39;)&#34; Text =&#34;构建恢复了NuGet包。再次构建项目以在构建中包含这些包。有关详细信息,请参阅http://www.postsharp.net/links/nuget-restore。&#34; /&GT;

&LT; /目标&GT;&GT;

我在SO {/ 3>的different post详细解答了

答案 3 :(得分:0)

我们正在使用'旧'MSBuild集成软件包恢复(存在.nuget \ NuGet.targets文件),并且通常不存储在源代码控制包中,而是依赖构建来为每个构建恢复它们。

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

  

构建恢复了NuGet包。再次构建项目以包括   这些包在构建中。

最简单的方法是明确包含在源代码管理包\ PostSharp.VerXXX中。

或者解决方案可以是migrating to automatic package restore
正如Issue Using PostSharp 3.x with NuGet Auto Restore

中所建议的那样

答案 4 :(得分:-1)

右键点击解决方案Manage Nuget packages;并删除你不想要的包。

尝试从Web还原包时,也会显示此错误。只需将自己连接到互联网,然后尝试打开项目。

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