【问题标题】:Nuget Automatic Restore for WebSite网站的 Nuget 自动恢复
【发布时间】:2015-06-30 17:41:51
【问题描述】:

我正在尝试将我的所有 C# 项目迁移到新的 Nuget 自动还原,遵循本教程:Migrating MSBuild-Integrated solutions to use Automatic Package Restore

我已经成功地完成了我的桌面/库项目,我必须编辑 .csproj 文件,从中删除这些行(我没有使用 TFS):

<RestorePackages>true</RestorePackages>  
...
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />  
...
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">  
    <PropertyGroup>
        <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>

但是,网站似乎没有任何 .csproj 或任何其他包含这些说明的文件。当我安装一个包时,它成功地将 .dll 放在了我的包文件夹中,但它也放在了 bin 文件夹中。如果我在解决方案资源管理器中选择 /bin 下的 .dll,它具有以下属性:

Auto-refresh path: C:\mypackages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll
File Name: Newtonsoft.Json.dll
Full Path: C:\MyWebSite\Bin\Newtonsoft.Json.dll

这是我第一次从 nuget 安装包时设置的默认值。我认为它不应该查看 bin 文件夹,或者当我构建项目时,如果它不存在,它应该将 .dll 带到 bin 文件夹。问题是如果我在 bin 中构建没有 .dll 的项目,它会给我以下错误:“找不到类型或命名空间名称'Newtonsoft'(您是否缺少 using 指令或程序集引用?)”。对于桌面/库项目,将 .dll 复制到 bin 文件夹。

我读到另一个问题 Nuget 不支持网站,而是 Web 应用程序:NuGet Package restore for website,但我还在 Nuget 的页面中读到他们增加了对 ASP.NET 网站的兼容性,所以这是我的问题:我我做错了什么?或者我应该迁移到 Web 应用程序,因为它们根本不支持网站?

【问题讨论】:

  • WAP 绝对是要走的路。如果您使用 VS,网站会受到更多限制,并且实际上并没有太多优势。请注意,随着 ASP.NET 5 的发布,它将结合两全其美。不过,我过去曾在网站上使用过 NuGet。

标签: c# asp.net visual-studio-2012 web-site-project nuget-package-restore


【解决方案1】:

我也有上述问题中描述的相同问题。我想知道您是否知道如何在没有项目文件的情况下在网站上进行 nuget 恢复。我在网站上有一个 package.config。

我尝试了很多不同的方法,下面的命令让我更接近解决方案,但并不完全。

nuget restore packages.config -PackagesDirectory ..\packages

上述命令确实按预期将包恢复到 ..\packages 文件夹中,但我不知道如何将正确的程序集放入网站的 bin 文件夹中。

【讨论】:

  • 似乎不可能做到这一点。我花了半天时间试图让它工作但没有成功。
  • 使用 .refresh 文件
【解决方案2】:

当您在 Visual Studio 解决方案的鼠标右键上下文菜单中单击“启用 NuGet 包还原”时,您会收到一条显示的信息消息:

安装到网站项目中的包将不会在此期间恢复 建造。考虑将它们转换为 Web 应用程序项目 必要的。

但是,我尝试了一种可行的解决方法。考虑当您有网站项目引用的类库 (DLL) 项目时的情况。如果两个项目都引用同一个 NuGet 包,则构建整个解决方案,首先构建 DLL 项目,包被正确还原。下一步,当涉及到网站项目时,所需的包已经到位,并且它的 DLL 根据*.refresh 文件复制到/Website/Bin/ 文件夹中。结果 - 解决方案构建成功完成。

【讨论】:

    【解决方案3】:

    我可以肯定地确认,在最新版本的 NuGet 下,NuGet 自动恢复功能确实适用于网站项目。

    确保:

    1. 您使用的是 NuGet 2.7 或更高版本(工具 > 扩展和更新 > 更新)
    2. 解决方案根目录下没有 .nuget\NuGet.targets 文件
    3. 您在网站根目录中有 packages.config,其中包含对包的所有引用(通常由 VS 在添加 NuGet 包时生成)
    4. Visual Studio 在 Visual Studio 中配置为“允许 NuGet 下载丢失的包”和“在构建期间自动检查丢失的包”(请参阅​​选项 > NuGet 包管理器) - 默认情况下这些是开启的

    当 Web Site 项目的某些包丢失时,我看到的构建输出如下。

    正在恢复 NuGet 包...
    要防止 NuGet 在构建期间恢复包,请打开 Visual Studio 选项对话框,单击包管理器节点并取消选中“允许 NuGet 在构建期间下载丢失的包”。
    ------ 构建开始:项目:WebSite1,配置:调试任何 CPU ------
    验证网站
    构建目录'/'。
    
    验证完成
    ========== 构建:1 个成功或最新,0 个失败,0 个跳过 ==========
    

    详细描述上述内容的链接:https://docs.nuget.org/consume/package-restore。

    【讨论】:

    • 我看到包正在恢复,但脚本似乎没有重新添加到实际的网站目录中。你看到它们被重新添加了吗?
    • @GodDibbs,你指的是哪些脚本?
    • 对不起,刚刚意识到我不够笼统:)。例如,如果您将 react nuget package 安装到网站项目,然后删除文件和 packages 文件夹,然后尝试恢复,则会重新填充 packages 文件夹,但网站中的 scripts 文件夹不会。
    • @GotDibbs,它可能与这个特定的包有关 - 我需要尝试一下。它肯定适用于常规的 .NET 程序集 NuGet 包(如 Newtonsoft.Json)。
    • @GotDibbs,对,在您的特定情况下,如果您删除它,“脚本”将不会被复制。但是看起来它与网站无关。这就是 NuGet 对此类“内容”包的工作方式——同样的行为也适用于 WebApplications 项目。它对程序集的工作方式不同的原因是为引用 DLL 创建的“.refresh”文件使 msbuild 使用 NuGet 包从位置复制它们。您的解决方法可能是带有构建事件的虚构项目,以从“包”复制所需的文件。 VS 将确保您始终保持最新状态。
    【解决方案4】:

    这是这个问题的解决方案,它确实有效。

    如果您有一个单独的业务逻辑层,您可以将 nuget 包安装到该项目中。然后,您可以在对网站解决方案执行 msbuild 之前在业务逻辑层执行 nuget restore。在包含 BLL 和网站的解决方案上执行 msbuild 时,它会将所有引用的程序集(包括 nuget 恢复的 dll)从 BLL 项目中拉出到网站的 bin 文件夹中。

    如果您没有单独的业务逻辑层,这是一个 hack 选项。 Using NuGet with *.dll.refresh files in ASP.NET "Web Site" projects with Web Deployment Projects

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多