在构建期间,NuGet包文件未复制到项目内容

时间:2013-02-18 17:52:32

标签: nuget nuget-package

我正在使用VS2012专业版和NuGet Package Manager版本2.2.31210构建MVC4 Web应用程序。我的解决方案中有多个项目,所有项目共享我使用NuGet安装的各种软件包。我的一个项目是一个MVC4 Web应用程序,我使用的是诸如bootstrap,jquery UI等软件包,所有这些都是使用NuGet安装的。

当我从我的存储库克隆我的整个解决方案的新副本并构建我的MVC4项目时,包恢复功能似乎正在工作:它在解决方案direcotry下创建packages目录并填充它的所有版本的包我希望看到。但是,内容文件不会被复制到MVC app目录中的适当位置。奇怪的是,它确实为内容创建了目录,但并没有自己复制内容文件。

例如,我使用的是Twitter Bootstrap包,它出现在packages / Twitter.Bootstrap.2.2.2中。在MVC项目中,在Content目录中创建了一个名为bootstrap(包含css,img和js目录)的目录。但是,没有css或js文件被复制到这些目录中!

有没有人知道我必须说出什么神奇的咒语才能让构建从NuGet包目录中复制这些内容文件?

5 个答案:

答案 0 :(得分:10)

我找到了一个解决方法,但它很难看。通过在NuGet包管理器控制台中执行以下命令:Update-Package -Reinstall所有文件确实已复制到Mvc项目ContentScripts目录中的适当位置。

不幸的是,这很有风险,因为您可能最终得到某些软件包的错误版本。例如,在我的情况下,在命令完成执行后(顺便说一下需要一段时间),我最终得到了jQuery版本1.4.4。这是旧的,我认为它必须是正在更新的其他一些包的显式依赖。因此看起来NuGet实际更新包的顺序很重要(它似乎不会解析所有包的整个依赖关系树,只选择所有依赖关系的最新版本,这看起来就像是首选行为)。相反,当命令执行时,我看到它用不同的版本多次替换jQuery包,因为它在所有包及其依赖项中运行,但结果只是一个非常旧的版本。

类似的方法是为每个导致我的问题的包显式执行Update-Package -Reinstall命令,但这非常繁琐且容易出错。

NuGet包恢复功能应该产生与手动执行包的Install-PackageUpdate-Package -Reinstall命令相同的结果,但它不会。

答案 1 :(得分:9)

这是我们都有的一个非常普遍的问题。我已经创建了一个MSBuild任务 NugetContentRestoreTask ,它会为你做这个技巧。在程序包管理器控制台中运行以下命令:

安装Nuget Content Restore MSBuild目标

    PM> Install-Package MSBuild.NugetContentRestore

唯一剩下的就是从你的BeforeBuild目标中调用它:

项目文件目标

    <Target Name="BeforeBuild">
      <NugetContentRestoreTask SolutionDir="$(SolutionDir)" ProjectDir="$(ProjectDir)" />
    </Target>

您可以查看source repo并在nuget.org

上找到它

其他内容文件夹

此nuget only includes the default folders scriptsimagesfontscontent,它不是递归目录包含的。对于其他内容子文件夹 - 您必须分配属性AdditionalFolders

    <Target Name="BeforeBuild">
        <NugetContentRestoreTask SolutionDir="$(SolutionDir)" ProjectDir="$(ProjectDir)" 
              AdditionalFolders="less;sass;common" />
    </Target>

答案 2 :(得分:4)

我不喜欢在源代码管理下拥有第三方JavaScript文件。这就是为什么我在http://nuget.codeplex.com/workitem/2094跟随Jeff Handley的建议来创建我自己的解决方案。我没有采用可执行的方式,而是创建了一个nuget解决方案级别的软件包来实现这个技巧。

http://www.nuget.org/packages/Baseclass.Contrib.Nuget.GitIgnoreContent/

它与git绑定,因为它会自动更新.gitignore文件。

简短说明:

忽略git中的nuget内容文件:

  • 在.gitignore文件中生成条目以从源存储库中排除nuget内容文件

  • 在构建之前恢复nuget内容文件(在VS中自动并使用powershell脚本手动

我写了一篇博客文章,描述了如何使用它。 http://www.baseclass.ch/blog/Lists/Beitraege/Post.aspx?ID=9&mobile=0

答案 3 :(得分:3)

在Visual Studio 2015 Update 1中,它们现在支持contentFiles。需要注意的是,它只适用于使用project.json的项目。

关于您遇到的问题,有一篇很好的博客文章解释了您看到此行为的原因:NuGet Package Restore Common Misconceptions

答案 4 :(得分:0)

对于我的项目,事实证明内容文件仅适用于PackageReferences

  1. 通过packages.config带有nuget引用的现有项目
  2. 已安装带有内容文件的NuGet软件包
  3. 构建项目
  4.   

    输出目录中没有内容文件

  5. packages.configPackageReferences的转换
  6. 构建项目
  7.   

    内容文件已复制到输出目录

IDE是Visual Studio2017。该项目是一个应用程序项目,意味着它采用旧的csproj格式。