【发布时间】:2014-11-27 02:33:16
【问题描述】:
情况
我想在 Windows 托管的开发环境中使用 gulp 和相关的前端工具链。我在尝试使用像 Browser-Sync 这样的 gulp 插件时碰壁了,因为 node_modules 文件夹图扇出使 Windows 文件路径太长而无法复制文件。我想要一种实用的方法来立即在 Windows 上处理此问题,无论 Node 社区将来可能会或可能不会提供什么来提高 Windows 上的 npm 可用性。
2 个问题
是否有适用于 Windows 的 npm 工作流按预期方式工作? “运行命令并安装文件”(例如,与 OSX 上的 npm、Linux 上的 npm、ruby gems 甚至 nuget 相当)我不想每次使用时都摆弄一堆手动文件编辑、符号链接等Windows 上的 npm。
是否有用于 npm 和节点执行的详细记录、稳定的 Cygwin 工作流来解决 Windows API 文件路径限制?
下面列出的血腥细节......
一般问题
- 在深度嵌套的 node_modules 层次结构中,从标准 Windows 命令提示符运行 npm install 失败。
- Per Joyent 的 github 存储库线程 this is an acknowledged issue 在以 Windows 为中心的环境中没有适合开发人员的解决方法。 (真的吗?)
- NT 内核支持最长 32,767 个字符的文件路径长度。
- Windows API 的 MAXPATH 限制为 260 个字符。
- Windows API 处理所有主要 Windows shell 的文件操作,不包括:Explorer、CMD、Powershell、MYSgit bash 等(真的是 MS?NTFS 已经存在多久了?)
- Cygwin 支持长文件路径,但由于 crlf 格式,npm.cmd 不能开箱即用。我在 npm 上尝试了 DOS2Unix 转换以使其与 Cygwin 一起使用,但似乎还有其他问题。
我目前的黑客攻击
- 在 C:\ 的根目录上创建一个“n”文件夹作为暂存区,因为 这缩短了我的文件夹路径。
- 在“n”文件夹中运行 npm 来安装我需要的模块。
- 启动 Cygwin 并使用 cp 将 node_modules 文件夹复制到目标项目中。
- 当依赖项发生变化或我需要启动新项目时,冲洗并重复。
其他令人不快的解决方法
符号链接可用于缩短文件路径,但这些都是笨拙的技巧。随着 npm 生态系统的发展,嵌套的依赖链会变得太长,这种变通方法变得无法使用。
在我遇到的一个线程中提到了将所有依赖项添加到根文件夹的 package.json 文件中。尽管这种方法会使文件夹结构变平并防止加载重复的模块,但这种解决方法感觉不自然。它还扼杀了 npm 的可用性、耐用性和生产力,因为您必须在安装后手动或使用一些 hacky 脚本来摆弄文件和文件夹。该方法也容易受到符号链接方法最终可能遭受的相同命运的影响。
【问题讨论】:
-
我几乎以为我已经解决了这个问题。我通过在以下 2 个文件上运行 dos2unix util 让 Cygwin 与 npm 一起工作:npm.cmd 和 npm
-
Windows API 路径限制使 npm 无法使用,因为某些 npm 模块使用 Visual Studio 来构建文件。这是我在 npm Browser-Sync 时收到的错误:C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppBuild.targets(301,5): error MS B3491: could不要将行写入文件“Release\obj\validation\validation.tlog\validation.lastbuilds tate”。指定的路径、文件名或两者都太长。完全限定文件名必须少于 260 个字符,目录名必须少于 248 个字符。
-
我可能有一种“taffy-pulling”方法来让节点模块在 windows 上加载 npm。它涉及以下几轮:npm install、npm dedupe、npm shrink 和 rm -r node_modules。反复这样做似乎在某种程度上消除了长文件路径,但这有点像拉太妃糖(例如,直到你完成才完成)。有没有人对此进行了编码或编写了一个自动化工具来使其更加交钥匙?
-
说到“hacky 脚本”,我写了一个我不觉得非常 hacky 的脚本。我创建了一个名为fenestrate 的工具,您可以使用它在安装后以编程方式展平模块的目录结构。您可以将其安装为全局 npm postinstall hook。
-
@yoneal 供个人使用,为了快速上手,fenestrate 应该递归遍历你的 node_modules 文件夹,因此你不需要在深度依赖项上手动运行它。但是,分叉这些依赖关系会很棒——我认为许多具有简单 fenestrate 配置的分叉模块会向 npm 维护者发送一个很好的信息。
标签: windows node.js npm filepath