8

我想我所有的C#项目迁移到新的NuGet自动恢复,下面这个教程:Migrating MSBuild-Integrated solutions to use Automatic Package Restore的NuGet自动恢复对网站的

我已经成功地完成它在我的桌面/库项目,我不得不编辑.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(是否缺少使用指令或程序集引用?”)。对于桌面/库项目,.dll被复制到bin文件夹。

我读过另一个问题Nuget不支持WebSite,而是Web应用代替:NuGet Package restore for website,但我也在Nuget的页面上看过他们已经添加了ASP.NET网站的兼容性,所以这里是我的问题:我是做错了什么?或者我应该迁移到Web应用程序,因为它们根本不支持Web站点?

+0

WAP绝对是要走的路。网站是有限的,并没有真正有很多优点,如果你正在使用VS.请注意,随着ASP.NET 5的发布,它将结合两全其美。尽管我在过去使用过NuGet和网站。 – mason

回答

2

当您单击“启用NuGet包还原”,在鼠标右键快捷菜单在Visual Studio中你得到所示的信息消息,该消息称,解决办法:

Packages installed into Website projects will not be restored during build. Consider converting those into Web application projects necessary.

然而,有一种变通方法我试过了作品。当您有一个由网站项目引用的类库(DLL)项目时,请考虑情况。如果两个项目引用相同的NuGet包,然后构建完整的解决方案,则首先构建DLL项目,然后正确恢复包。下一步,当涉及到Website项目时,所需的软件包已经就位,根据*.refresh文件将其DLL复制到/Website/Bin/文件夹中。结果 - 解决方案构建成功完成。

2

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

确保:

  1. 您正在使用的NuGet 2.7或更高(工具>扩展和更新>更新)
  2. 在溶液中没有.nuget \ NuGet.targets文件根
  3. 你有包。配置在网站根一起包(由VS加的NuGet软件包时正常生成)
  4. Visual Studio的配置为所有引用“允许的NuGet下载缺失的软件包”和“自动检查生成过程中丢失的包“在Visual Studio(见选项> NuGet包管理器) - 这些都是默认

在这里我看到了什么作为构建输出时,一些包网站项目缺失。

Restoring NuGet packages... 
To prevent NuGet from restoring packages during build, open the Visual Studio Options dialog, click on the Package Manager node and uncheck 'Allow NuGet to download missing packages during build.' 
------ Build started: Project: WebSite1, Configuration: Debug Any CPU ------ 
Validating Web Site 
Building directory '/'. 

Validation Complete 
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ========== 

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

+0

我看到要恢复的软件包,但脚本似乎没有重新添加到实际的网站目录中。你看到他们被重新添加? – GotDibbs

+0

@GodDibbs,你的意思是哪个脚本? –

+0

对不起,刚刚意识到我没有足够通用:)。例如,如果您将[反应nuget软件包](https://www.nuget.org/packages/react.js/)安装到网站项目,然后删除文件和软件包文件夹,然后尝试恢复,包文件夹被重新填充,但网站中的脚本文件夹没有。 – GotDibbs

2

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

我试了一堆不同的东西,下面的命令让我更接近一个解决方案,但并不完全。

的NuGet恢复packages.config -PackagesDirectory .. \包

上面的命令恢复包入.. \ packages文件夹如预期,但我无法弄清楚如何得到正确的组件成该网站的bin文件夹。

1

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

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

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