我正在使用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时,会将其添加到项目中,并且错误条件会检查以下内容:
但是,如果我在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。
答案 0 :(得分:4)
这取决于还原的完成方式以及您安装的NuGet版本。看起来错误消息试图涵盖三种情况:
如果您正在使用基于MSBuild的程序包还原,则在构建期间将进行还原,此时将不会导入PostSharp文件,因此$(PostSharp30Imported)将为空,并将显示第二条错误消息。至少我怀疑是这样的。
如果您从命令行构建而不使用基于MSBuild的软件包还原,那么如果NuGet软件包丢失,您将看到第一条错误消息。
如果您没有使用基于MSBuild的程序包还原,并且正在使用最新版本的NuGet在Visual Studio中构建,那么您在更新任何内容之前将恢复这些程序包是正确的。因此,在甚至执行之前,PostSharp导入应该可供MSBuild使用。
答案 1 :(得分:2)
由于在msbuild加载期间需要PostSharp dll(因此在构建期间引用此dll的目标可用),因此在最终调用msbuild时它们必须可用。
虽然在VS中可以单击构建两次,但我在CI环境中使用PostSharp,并且要求在解决方案上调用构建两次令人沮丧(首先构建恢复nugets但由于错误而构建失败)。
我最终得到了单独的构建步骤:
NuGet.exe restore SolutionWithProjectsUsingPostSharp.sln
答案 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)