Nuget自动还原为WebSite

时间:2015-04-22 20:30:06

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

按照本教程,我尝试将所有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放在我的packages文件夹中,但它也放在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的情况下构建项目,它会给我以下错误:&#34;类型或命名空间名称&#39; Newtonsoft&#39;找不到(你是否错过了使用指令或汇编引用?)&#34;。对于桌面/库项目,.dll将复制到bin文件夹。

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

4 个答案:

答案 0 :(得分:6)

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

我尝试了很多不同的东西,以下命令让我更接近分辨率,但并不完全。

nuget restore packages.config -PackagesDirectory .. \ packages

上面的命令确实按预期将包恢复到.. \ packages文件夹中,但我无法弄清楚如何将正确的程序集放入网站的bin文件夹中。

答案 1 :(得分:2)

点击&#34;启用NuGet包恢复&#34;在Visual Studio解决方案的鼠标右键上下文菜单中,您会看到一条信息显示:

  

在网站项目中安装的软件包将无法恢复   建立。考虑将它们转换为Web应用程序项目   必要的。

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

答案 2 :(得分:2)

我绝对可以确认NuGet自动恢复功能实际上适用于VS下的网站项目和最新版本的NuGet。

确保:

  1. 您使用的是 NuGet 2.7或更高版本(工具&gt;扩展和更新&gt;更新)
  2. 解决方案根目录中有 no .nuget \ NuGet.targets 文件
  3. 您在网站根目录中有 packages.config ,包含对包的所有引用(通常在添加NuGet包时由VS生成)
  4. 在Visual Studio中将Visual Studio配置为“允许NuGet下载丢失的软件包”和“在构建期间自动检查缺少的软件包”(请参阅​​选项&gt; NuGet软件包)经理) - 默认情况下这些是
  5. 这里我看到的 Web Site 项目的某些包缺失时的构建输出。

    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

答案 3 :(得分:1)

以下是此问题的解决方案,它确实有效。

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

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