6

我已将 packages.config 文件签入源代码管理。这指定了我想要的 Nuget 依赖项的确切版本。我们有自己的 NuGet 存储库。我们正在自己创建这些 NuGet 包。

<packages>
  <package id="Dome" version="1.0.0.19" targetFramework="net45" />
  <package id="Dome.Dojo" version="1.0.0.19" targetFramework="net45" />
</packages>

这些包有一些 JavaScript 文件,当您在 Visual Studio 中添加 Nuget 包作为参考时,这些文件会复制到项目中的 Scripts 文件夹中。

我不想将这些 JS 文件签入源代码控制,我只想签入 packages.config 文件。

当我的项目在 Team City 中构建时(或者当我在重新签出后在 Visual Studio 中构建时)它不会从 NuGet 包中复制 JS 文件。这里有一个问题解释了类似的问题:

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

但是,该问题的答案中的解决方案对我不起作用;该解决方案使用 ReInstall,这是有问题的,因为它可以自动升级 packages.config 文件中的版本(例如,如果将依赖项指定为 >=)。

这样做的全部意义在于,我希望能够从我的源代码管理中签出修订,并使用正确的依赖项构建该版本,并且我想使用 NuGet 的出色打包功能。所以,我不希望任何“在构建过程中自动更新到最新版本”。

NuGet ( http://nuget.codeplex.com/workitem/2094 ) 存在一个关于 NuGet 文件不恢复内容文件的问题。它被标记为按设计关闭。

再考虑一下这是如何工作的,在我看来(但我不是 100% 确定)对于程序集,NuGet 具有不同的行为 - 它不会将它们复制到项目中,而是从包文件夹。让我印象深刻的是,NuGet 包中的 js 文件应该像引用dll 一样被引用。

有没有办法构造一个 NuGet 包,以便它引用 JS 作为项目中的链接(类似于如何在 VS 中添加现有文件作为链接)?这会解决我的问题吗?

如果没有,那么我将在关闭上面提到的 Nuget 问题 2094 时接受 Jeff Handley 给出的建议:

您可以选择创建一个引用 NuGet.Core 的新控制台可执行文件,并且您可以构建一个补充包还原供您自己使用,将包内容复制到项目中。

编写我自己的命令行工具来复制内容似乎我在这里推水 - 我在做一些根本错误的事情吗?

4

3 回答 3

1

当一个包安装到项目中时,NuGet 实际上会执行这些操作,

  1. 从源下载包文件;
  2. 将包安装到所谓的packages文件夹中,默认为$(SolutionDir)\packages;
  3. 将包安装到项目中,包括添加对 DLL 的引用、将内容文件复制到项目目录等。

当一个包被恢复时,只执行前两个步骤。nuget 包还原不会触及项目。这就是为什么您的项目中的 js 文件不会被“恢复”的原因。

目前唯一的解决方案是签入项目中的 js 文件。

于 2013-10-30T06:35:49.213 回答
1

如果您是包的所有者,那么您可以使用我创建的 nuget 包,以便能够在包中包含一个名为“Linked”的文件夹,并添加一个简单的 Install.ps1 和 Uninstall.ps1(一个衬垫) nuget 包的链接文件夹中的每个文件都存在于项目中。

https://github.com/baseclass/Contrib.Nuget#baseclasscontribnugetlinked

我没有尝试发布如何处理链接文件,问题在于调试项目,因为目录中将缺少 JavaScript 文件。

如果您使用 git 作为源代码控制,您可以尝试我的 nuget 包,它会忽略所有 nuget 内容文件并在构建之前自动恢复它们。

我的博客中的分步示例:http ://www.baseclass.ch/blog/Lists/Beitraege/Post.aspx?ID=9&mobile=0

于 2014-07-18T08:44:48.110 回答
1

这里的根本问题是 Visual Studio 对 JavaScript 项目的支持相对较差,以及 JavaScript 缺乏内置的模块加载器。

对于 C#,当你安装一个包时,它会在你的 .csproj 文件中添加一个对磁盘上程序集的引用。构建时,MSBuild 知道将引用的内容复制到 bin 目录。由于您没有签入 bin 目录,因此这一切都很好。

不幸的是,对于 JavaScript,构建系统还没有那么成熟,并且没有明确定义的准则供 NuGet 遵循。理想情况下(IMO),Visual Studio 不会直接从您的源目录运行网站。相反,当你构建它时,它会将 JavaScript 文件、CSS 和 HTML 文件复制到一个 bin 目录中,并从中执行它们。调试时,它会将这些映射回原始 JavaScript 或 TypeScript 文件(因此,如果您进行更改,它不会映射到临时文件)。如果发生这种情况,那么现在有一个明确定义的构建步骤,并且可能是一个明确定义的 JavaScript 文件标签(而不仅仅是“内容”)。这意味着 NuGet 将能够利用定义明确的 MSBuild 标记,并且包作者可以利用 NuGet 功能做正确的事情。

不幸的是,以上都不是真的。JavaScript 文件在原地运行,如果您在构建时将它们复制到 bin,Visual Studio 会做错事,并且从调试器进行编辑会编辑临时文件(而不是原始文件)。因此,NuGet 没有明确定义的文件放置位置,因此将决定权留给包作者。包作者知道普通用户将直接从源代码运行(无构建步骤),因此他们将文件转储到源文件夹中,必须将它们签入到版本控制中。

如果您来自像 C# 这样的现代生态系统,那么整个系统都非常陈旧,有人花时间思考这些事情。

可以做的是创建一个 MSBuild 任务,在构建之前,该任务将遍历您的所有包、查找内容并将该内容复制到所需位置。这不会很困难,尽管需要一些工作。

此外,包作者可以在他们的包中包含一个执行此操作的构建任务,以便在构建之前将其所有内容复制到本地。不幸的是,如果只有一些包作者这样做,那么您最终会出现奇怪的碎片,其中一些包需要提交给版本控制,而另一些则不需要。

于 2015-03-22T22:19:09.603 回答