我正在使用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版本。看起来错误消息试图涵盖三种情况:
- 在未启用基于MSBuild的包恢复的情况下构建(在Visual Studio中通过右键单击解决方案并选择Enable package restore来配置)。
- 基于MSBuild的包恢复未启用时,在Visual Studio之外构建。
- 使用旧版本的NuGet在Visual Studio中构建,该版本不支持构建前的自动恢复。
如果你正在使用基于MSBuild的包还原,那么还原将在构建期间发生,此时PostSharp文件将不会被导入,因此$(PostSharp30Imported)将为空,并且将显示第二个错误消息。至少我怀疑情况是这样的。
如果您从命令行构建并且不使用基于MSBuild的包还原,那么如果NuGet包丢失,您将看到第一个错误消息。
如果您没有使用基于MSBuild的包还原,并且正在使用最新版本的NuGet从Visual Studio中构建,那么您是正确的,包将在构建任何内容之前恢复。所以PostSharp导入应该在MSBuild执行之前就可以使用。
由于PostSharp dll在msbuild加载期间是必需的(因此引用该dll的目标在构建期间可用),它们必须在msbuild最终调用时可用。
虽然在VS中点击构建两次是可以接受的,但我在CI环境中使用PostSharp,并且要求在解决方案上调用两次构建是令人沮丧的(第一次构建恢复nugets,但由于错误而构建失败)。
我最终使用了单独的构建步骤:
- 恢复nuget包(这将下载PostSharp包并返回成功代码到环境):
NuGet.exe restore SolutionWithProjectsUsingPostSharp.sln
- 构建解决方案。
您需要在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恢复包时,也会出现此错误。只要把你自己连到互联网上,然后试着打开这个项目。
按照上面的步骤,错误消失了。