【问题标题】:NuGet packages and the bin folder in ASP.NET Web Pages siteASP.NET 网页站点中的 NuGet 包和 bin 文件夹
【发布时间】:2014-04-26 22:40:37
【问题描述】:

这可能是一个非常基本的问题,但是packages 文件夹下的 DLL 复制到 bin 文件夹的机制是什么?

例如,我有一个解决方案,其中包含一个网站类型的“项目”(节点)(即,没有 csproj,只是基于文件系统)。这是一个非常基本的静态网站。我想添加 ASP.NET 网页支持,所以我安装了this NuGet package,现在packages 文件夹下有一些 DLL,我的web.config 已更新。但是,当我运行该站点时,它显示 YSOD 并显示错误“无法确定要使用的 ASP.NET 网页的版本”,我猜这是因为其中没有包含 DLL 的 bin 文件夹(当我创建一个在 Visual Studio 中从头开始的“Razor”站点,bin 文件夹就在那里)。如果我尝试重建解决方案,它会失败并出现同样的错误,这次是编译错误(不是运行时错误)。

packages 文件夹恢复bin 文件夹的命令或机制是什么?我不想在我的源代码控制中有 DLL,根据 NuGet 文档,似乎非常支持这个工作流。我想如果它是基于 csproj 的项目,会有一些 MS Build 操作或类似的东西来使用 packages 文件夹中的 DLL,但这是一个网站,我无法定义高级构建操作,可以吗?

【问题讨论】:

  • 当我创建一个新的 ASP.NET 网站(Razor v3)时,该包已经安装。
  • 是的,就是从头开始。但是请参阅问题中的示例 - 我从一个已经存在的项目开始,目前没有 bin 文件夹。
  • 我不想在我的源代码管理中包含 DLL,根据 NuGet 文档,似乎非常支持此工作流。 当您可以构建时支持此工作流一个专案。 NuGet 包还原会在生成之前下载所需的包。我认为您必须创建一个 bin 文件夹并将其提交到源代码管理。

标签: asp.net nuget


【解决方案1】:

使用 Visual Studio 2013,当我将 NuGet 包(例如 Microsoft.AspNet.Razor)安装到 ASP.NET 网页应用程序中时,会创建 bin 文件夹。

将二进制文件放入 bin 文件夹是构建过程的一部分,它不是由 NuGet 完成的。 NuGet 可用于将文件还原到 packages 文件夹,但在还原时不会对 bin 文件夹执行任何操作。

要使构建和包恢复正常工作,您似乎需要保留 bin 文件夹和任何 .refresh 文件。您可以从版本控制系统中删除其他二进制文件。

System.Web.Razor.dll.refresh

这个文件的内容告诉 Visual Studio 在哪里可以找到 NuGet 包:

 ..\..\Projects\MyWebSite\packages\Microsoft.AspNet.Razor.3.1.2\lib\net45\System.Web.Razor.dll

为了测试这一点,我从 bin 文件夹中删除了所有二进制文件,删除了 packages 文件夹,然后重新构建了项目。 Visual Studio 会还原包,并在构建时将所需的程序集复制到项目的 bin 文件夹中。

【讨论】:

  • 指向refresh 文件的好指针!不幸的是,VS 2013 似乎没有办法在 packages 文件夹内的某处添加对 DLL 的引用,但至少我可以从一些临时项目中复制这些 *.refresh 文件并从那里开始。难道你不知道,Azure 网站会理解 *.refresh 文件吗?这是我的目标托管环境。
  • MSBuild 可以理解 *.dll.refresh 文件。它们被网站项目使用,因为它们没有任何项目文件 (.csproj) 来放置程序集引用。作为部署的一部分,需要执行 NuGet 还原,然后需要运行 MSBuild 以在站点发布之前复制二进制文件。 Visual Studio 将支持所有这些。因此,如果您使用 Visual Studio 部署到 Azure,应该没问题。在不使用 Visual Studio 的情况下部署站点是另一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 2016-11-23
相关资源
最近更新 更多