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

Ang*_*uso 22 nuget nuget-package

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

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

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

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

Ang*_*uso 11

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

不幸的是,这是有风险的,因为您可能最终得到某些软件包的错误版本.例如,在我的情况下,在命令完成执行后(顺便说一下需要一段时间),我最终得到了jQuery版本1.4.4.这是旧的,我认为它必须是正在更新的其他一些包的显式依赖.因此看起来NuGet实际更新包的顺序很重要(它似乎不会解析所有包的整个依赖关系树,只选择所有依赖关系的最新版本,这看起来就像是首选行为).相反,如命令执行我看到它与不同的版本取代了jQuery包好几次,因为它的工作方式,通过所有的包和它们的依赖,只能用一个很老的版本就结了.

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

NuGet包还原功能应该产生与手动执行包Install-PackageUpdate-Package -Reinstall命令相同的结果,但事实并非如此.


小智 10

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

安装Nuget Content Restore MSBuild目标

    PM> Install-Package MSBuild.NugetContentRestore
Run Code Online (Sandbox Code Playgroud)

剩下的唯一事情就是从你的BeforeBuildTarget 调用它,如下所示:

项目文件目标

    <Target Name="BeforeBuild">
      <NugetContentRestoreTask SolutionDir="$(SolutionDir)" ProjectDir="$(ProjectDir)" />
    </Target>
Run Code Online (Sandbox Code Playgroud)

您可以查看源代码库并在nuget.org上找到它

其他内容文件夹

这的NuGet 只包括默认文件夹 scripts,images,fonts,并且content,它不是一个递归目录包括.对于其他内容子文件夹 - 您必须分配属性AdditionalFolders.

    <Target Name="BeforeBuild">
        <NugetContentRestoreTask SolutionDir="$(SolutionDir)" ProjectDir="$(ProjectDir)" 
              AdditionalFolders="less;sass;common" />
    </Target>
Run Code Online (Sandbox Code Playgroud)