Nuget自动还原网站程序包

12

我正在尝试将所有的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文件,它应该将.dll文件带到bin文件夹中。问题是,如果我在bin中没有.dll文件构建项目,它会给我以下错误:“找不到类型或命名空间名称'Newtonsoft'(是否缺少using指令或程序集引用?)”。对于桌面/库项目,.dll文件将被复制到bin文件夹中。

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


WAP绝对是正确的选择。如果您使用VS,网站的功能要受到很大限制,而且实际上并没有太多优势。请注意,随着ASP.NET 5的发布,它将结合两者的优点。虽然我以前在网站中使用NuGet也没问题。 - mason
4个回答

8
我也有上述问题描述的同样问题。我想知道你是否找到了在没有项目文件的情况下对网站进行NuGet还原的方法。我在网站中有一个package.config。
我尝试了很多不同的方法,以下命令让我更接近解决方案,但还不够完美。
nuget restore packages.config -PackagesDirectory ..\packages
上述命令确实将包恢复到..\packages文件夹中,但我无法弄清楚如何将正确的程序集放入网站的bin文件夹中。

似乎无法做到。我花了半天时间尝试让它工作,但没有成功。 - dcp
3
使用 .refresh 文件。 - CodeDreamer68

2
当你在Visual Studio中的解决方案上右键单击并选择“启用NuGet包还原”时,会弹出一个信息提示框,内容如下:
“安装到网站项目中的包不会在构建期间还原。考虑将其转换为Web应用程序项目。”
但是有一个我试过的解决方法。假设你有一个被网站项目引用的类库(DLL)项目。如果这两个项目都引用相同的NuGet包,在构建整个解决方案时,DLL项目会首先构建,包会被正确还原。接下来进行网站项目构建时,所需的包已经就位,其DLL文件将根据*.refresh文件复制到/Website/Bin/文件夹中。结果——解决方案构建成功。

2
这是解决此问题的方法并且已经可行。如果您有一个单独的业务逻辑层,您可以将NuGet包安装到该项目中。然后,在进行网站解决方案上的msbuild之前,您可以在业务逻辑层上执行nuget恢复。当对包含BLL和WebSite的解决方案进行msbuild时,它将从BLL项目中提取所有引用的程序集(包括nuget还原的dlls)到网站的bin文件夹中。 如果您没有单独的业务逻辑层,则有一个hack选项。在带有Web部署项目的ASP.NET“Web Site”项目中使用*.dll.refresh文件的NuGet方法。

2
我可以肯定地确认,对于使用最新版本的 NuGet 的 Web Sites 项目,NuGet 自动还原功能确实有效。
请确保:
1. 您正在使用 NuGet 2.7 或更高版本(工具 > 扩展和更新 > 更新); 2. 解决方案根目录中没有 .nuget\NuGet.targets 文件; 3. 在 Web Site 根目录中有 packages.config 文件,并且其中包含所有对包的引用(通常在添加 NuGet 包时由 VS 自动生成); 4. Visual Studio 已配置为在“选项 > NuGet 包管理器”中启用“允许 NuGet 下载缺少的包”和“在构建期间自动检查缺少的包” - 这些默认情况下是开启的。
下面是当某个 Web Site 项目的某个包缺失时的构建输出。
恢复 NuGet 包... 为了防止 NuGet 在构建过程中还原包,请打开 Visual Studio 选项对话框,单击“包管理器”节点,然后取消选中“允许 NuGet 在构建过程中下载缺少的包”。 ------ 正在启动构建:项目:WebSite1,配置:Debug Any CPU ------ 正在验证网站 正在构建目录 '/'。
验证完成 ========== 构建: 成功或已更新 1 个,失败 0 个,跳过 0 个 ==========

有关上述内容的详细信息,请参见链接 https://docs.nuget.org/consume/package-restore


我看到软件包正在恢复,但是脚本似乎没有重新添加到实际的网站目录中。你看到它们被重新添加了吗? - GotDibbs
@GodDibbs,你指的是哪些脚本? - Eugene D. Gubenkov
抱歉,我刚意识到我的表述不够通用 :). 例如,如果您将 react nuget package 安装到网站项目中,然后删除文件和 packages 文件夹,然后尝试还原,那么 packages 文件夹会重新填充,但网站中的 scripts 文件夹则不会。 - GotDibbs
@GotDibbs,可能是这个特定的包有问题 - 我需要试一下。对于常规的.NET程序集NuGet包(如Newtonsoft.Json),它肯定有效。 - Eugene D. Gubenkov
1
@GotDibbs,没错,在你的特定情况下,如果删除它,“脚本”将不会被复制。但是看起来与网站无关。这是因为NuGet针对此类“内容”包的工作方式-Web应用程序项目也会具有相同的行为。对于程序集,其工作方式之所以不同是因为创建了“.refresh”文件以引用DLL,这使得msbuild可以从NuGet包位置复制它们。你可能需要使用虚构项目,并添加一个构建事件,以从“packages”中复制所需的文件。VS将确保您始终拥有最新版本。 - Eugene D. Gubenkov
非常感谢您提供如此详细的答案!! - GotDibbs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接