【问题标题】:NuGet package files not being copied to project content during build在构建期间未将 NuGet 包文件复制到项目内容
【发布时间】:2013-02-03 05:48:35
【问题描述】:

我正在使用带有 NuGet 包管理器版本 2.2.31210 的 VS2012 专业版构建 MVC4 Web 应用程序。我的解决方案中有多个项目,所有项目都共享我使用 NuGet 安装的各种包。我的一个项目是一个 MVC4 Web 应用程序,我在其中使用了 bootstrap、jquery UI 等包,所有这些包都是使用 NuGet 安装的。

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

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

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

【问题讨论】:

  • 这似乎被这个错误nuget.codeplex.com/workitem/1239跟踪
  • @Deepak 这对我来说似乎是一个相当大的错误。如果 NuGet 包还原功能没有将文件复制到在初始安装包时复制的相同位置,我认为它从根本上被破坏了。
  • 这是按照Common NuGet Misconceptions: Package Restore 的说明设计的。我在@FranciscoLopez 答案库中找到了链接

标签: nuget nuget-package


【解决方案1】:

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

安装 Nuget 内容还原 MSBuild 目标

    PM> Install-Package MSBuild.NugetContentRestore

唯一剩下的就是从你的BeforeBuild Target 调用它,如下所示:

项目文件目标

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

您可以查看source repo 并在nuget.org 上找到它

其他内容文件夹

此 nuget only includes the default foldersscripts、images、fonts 和 content,它不是递归目录包括的。对于其他内容子文件夹 - 您必须分配属性 AdditionalFolders。

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

【讨论】:

【解决方案2】:

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

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

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

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

【讨论】:

  • “Update-Package -Reinstall”为我解决了这个问题(Microsoft.WindowsAzure.Storage / WindowsAzure.Storage 出现问题 - CloudAnalyticsClient.cs 文件出错)
  • 您也可以使用Update-Package -Reinstall -project YourProject -FileConflictAction OverwriteAll 缩小项目范围,希望对您有所帮助。
【解决方案3】:

我也不喜欢将第三方 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

【讨论】:

  • Daniel - 在 Windows 10 上得到这个 ...无法找到类型 [NuGet.VisualStudio.IRepositorySettings]。在 D:\MOBILEDEV\ionic\Wenzaa\packages\Baseclass.Contrib.Nuget.GitIgnoreContent.0.0.2\tools\Baseclass.Contrib.Nuget.GitIgnoreContent.psm1:213 char:54 + ... $componentModel.GetService([ NuGet.VisualStudio.IRepositorySettings]) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (NuGet.VisualStudio.IRepositorySettings:TypeName) [], RuntimeException + FullyQualifiedErrorId : TypeNotFound
  • 看起来包不再维护了。无法在 Win10 上使用 VS2017...
【解决方案4】:

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

关于您遇到的问题,有一篇很好的博文解释了为什么您会看到这种行为:NuGet Package Restore Common Misconceptions。

【解决方案5】:

对于我的项目,结果证明内容文件仅适用于 PackageReferences:

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

  5. 将packages.config 转换为PackageReferences
  6. 构建项目
  7. 内容文件已复制到输出目录

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 2019-12-23
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多