问题 NuGet包和ASP.NET网页站点中的bin文件夹


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

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

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


8467
2018-04-26 22:40


起源

当我创建一个新的ASP.NET网站(Razor v3)时,已经安装了该软件包。 - Ufuk Hacıoğulları
是的,这是从头开始的时候。但请参阅问题中的示例 - 我从一个已经存在但没有的项目开始 bin 文件夹,目前。 - Borek Bernard
我不想在我的源代码控制中使用DLL,根据NuGet文档,似乎非常支持这个工作流程。 您可以在构建项目时支持此功能。 NuGet包还原在构建之前下载所需的包。你必须创建一个bin文件夹并将其提交给我认为的源代码控制。 - Ufuk Hacıoğulları


答案:


使用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文件夹中。


12
2018-04-27 09:25



指向的好指针 refresh 文件!不幸的是,VS 2013似乎没有办法在其中的某个地方添加对DLL的引用 packages文件夹但至少我可以从一些临时项目中复制那些* .refresh文件并从那里开始。难道你不知道,Azure网站是否会理解* .refresh文件?这是我的目标托管环境。 - Borek Bernard
MSBuild可以理解* .dll.refresh文件。它们由Web站点项目使用,因为它们没有任何项目文件(.csproj)来放置程序集引用。作为部署的一部分,需要进行NuGet还原,然后需要运行MSBuild以在发布站点之前复制二进制文件。所有这些都将得到Visual Studio的支持。因此,如果使用Visual Studio部署到Azure,则应该没问题。在不使用Visual Studio的情况下部署站点是另一个问题。 - Matt Ward