使用PostSharp发行x与NuGet自动恢复

本文关键字:恢复 NuGet PostSharp 发行 使用 | 更新日期: 2023-09-27 18:18:06

我有一个解决方案与许多项目,其中一些使用PostSharp。我最近从使用NuGet MSBuild集成还原切换到使用NuGet自动还原。这将导致在构建开始之前为所有包还原所有必要的包。这工作得很好,除了现在我经常遇到一个问题,即PostSharp将失败的构建错误:

构建恢复了NuGet包。再次构建项目以在构建中包含这些包。欲了解更多信息,请参见http://www.postsharp.net/links/nuget-restore。

当我编辑项目文件时,我看到以下条目:

  <Import Project="..'..'packages'PostSharp.3.1.46'tools'PostSharp.targets" Condition="Exists('..'..'packages'PostSharp.3.1.46'tools'PostSharp.targets')" />
  <Target Name="EnsurePostSharpImported" BeforeTargets="BeforeBuild" Condition="'$(PostSharp30Imported)' == ''">
    <Error Condition="!Exists('..'..'packages'PostSharp.3.1.46'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.46'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包在我的机器上存在并且在我的机器上不存在时,有一个错误条件。因为变量$(PostSharp30Imported)从未被设置,所以这些条件似乎是被评估的。我假设这是依赖于MSBuild集成版本的恢复,但我没有足够的MSBuild经验来确定。

我能够通过简单地删除项目文件中的第二个错误条件来解决这个问题(因为我保证在项目构建时拥有这些文件),但似乎PostSharp的任何升级或添加都会导致项目文件恢复到旧方式,并阻止我的解决方案构建。

这是一个错误在PostSharp,或者有一些其他的方式,我应该与PostSharp工作时使用NuGet自动恢复,不会导致这个问题?

使用PostSharp发行x与NuGet自动恢复

如果您已经完全从旧的基于MSBuild的包恢复迁移了,那么如果您使用的是最新版本的NuGet,您应该不会看到该错误消息。Visual Studio检查. NuGet/NuGet文件是否存在。如果此文件存在,则不使用新的基于Visual Studio的包还原。

更新的自动包恢复将在您构建项目时发生,但在MSBuild启动之前。这意味着在PostSharp MSBuild目标文件中定义的各种MSBuild属性将在MSBuild尝试编译你的项目之前导入。在这种情况下,应该定义PostSharp30Imported,这样自定义目标就永远不会运行。它只会在PostSharp。MSBuild正在编译项目时,目标文件不存在。

对于旧的基于MSBuild的包还原,错误信息是正确的,因为构建将在MSBuild运行时恢复目标文件,因此它们将不可用,因此未导入,用于第一次构建。

创建一个新项目,添加PostSharp,删除所有包,然后重新编译项目,我没有看到错误消息