gulp编译出现Cannot find module 'internal/util/types'——node环境的变更

本文分享了一次Node.js从8.9版本回退至6.9版本再升级的经验,详细记录了过程中遇到的“Cannot find module 'internal/util/types'”错误及解决方案,通过检查依赖包并重新安装对应版本的包最终解决了问题。

  一心埋头敲代码,再回首,nodejs都蹦跶到8.9版本了,为了跟上时代,妥妥的赶紧升级啊,升级的结果。。。Cannot find module 'internal/util/types'。。。

  

   于是宝宝又没节操的换回了6.9版本的node,此处友情链接6.9版本的下载地址:https://nodejs.org/dist/ 或者评论留下邮箱,发你啊,此处吐槽一下优快云下载,居然要5个C币,宝宝勤勤恳恳的猜只有4个C币。。。

  换回来以后,居然就好了。。就好了。。。莫名的不开森,于是又切换回了8.9版本,啊哈哈哈。。

  

  首先,使用npm list graceful-fs,显示依赖这个包的其他包:

  

  然后使用npm install gulp --save-dev安装对应的包,最后再重新使用gulp,最后发现完美啦~

转载于:https://www.cnblogs.com/mini-fan/p/8409677.html

<think>我们面临的问题是在无网络的Linux环境中手动安装n模块(用于管理Node.js版本)和gulp模块,并创建软链接/usr/bin/n和/usr/bin/gulp。由于是无网络环境,我们需要预先在有网络的环境中下载好所需的安装包,然后复制到目标机器上进行安装。 步骤概述: 1. 在有网络的机器上下载Node.js二进制包(用于安装Node.js和npm,因为无网络环境下无法通过包管理器安装)。 2. 下载n模块和gulp的npm包(包括其依赖包)。 3. 将下载好的文件复制到无网络Linux机器上。 4. 在无网络机器上安装Node.js(这样我们才有npm可用)。 5. 使用npm离线安装n模块和gulp。 6. 创建软链接。 详细步骤: ### 1. 在有网络的机器上准备文件 首先,我们需要下载Node.js的Linux二进制包(x64或arm等,根据目标机器架构选择)。我们可以从[Node.js官网](https://nodejs.org/en/download/)下载。 假设我们选择Node.js 14.17.0 LTS版本(版本可以根据需要选择),下载链接为:https://nodejs.org/dist/v14.17.0/node-v14.17.0-linux-x64.tar.xz 下载: ```bash wget https://nodejs.org/dist/v14.17.0/node-v14.17.0-linux-x64.tar.xz ``` 然后,我们需要下载n模块和gulp的npm包以及它们的依赖。我们可以使用`npm pack`命令来获取这些包的tarball。 首先,在有Node.js环境的机器上(如果没有,先安装Node.js)创建一个临时目录,然后在该目录中下载n和gulp的包: ```bash mkdir offline-packages cd offline-packages npm pack n npm pack gulp ``` 但是,这样只会下载n和gulp的包,而不会下载它们的依赖。为了下载所有依赖,我们可以使用`npm install`配合`--cache`和`--cache-min`选项,然后收集所有下载的包。 更简单的方法是使用`npm-offline-pack`工具,但这里我们手动操作: 创建一个package.json文件,只包含我们需要安装的模块: ```json { "name": "offline-installation", "version": "1.0.0", "dependencies": { "n": "^8.0.1", "gulp": "^4.0.2" } } ``` 然后,运行以下命令来下载所有依赖到本地目录: ```bash npm install --cache ./npm-cache --no-save ``` 但是,这样下载的依赖包在`./npm-cache`中,但并不是直接是tarball文件。我们可以使用另一种方法:使用`npm cache`命令。 另一种推荐的方法是使用`npm-pack-all`工具,但为了简单,我们可以直接复制整个`node_modules`目录,然后在离线机器上使用`npm install ./path/to/package.tgz`安装。 不过,考虑到依赖关系复杂,我们使用`npm install`的离线安装方式:将整个`node_modules`目录和package.json、package-lock.json一起复制到离线机器,然后在离线机器上使用`npm install --offline`。但这样可能会遇到问题。 因此,我们采用另一种方法:使用`npm-bundle`工具(需要先全局安装)来生成一个包含所有依赖的bundle文件。但这里我们手动下载所有依赖的tarball。 我们可以使用以下脚本(在临时目录中): ```bash # 创建package.json echo '{"dependencies":{"n":"^8.0.1","gulp":"^4.0.2"}}' > package.json # 使用npm install --dry-run来获取依赖列表,然后手动下载(不推荐,太麻烦) # 推荐方法:使用npm-offline-packager # 如果没有npm-offline-packager,先安装:npm install -g npm-offline-packager # 然后运行: npm-offline-packager ./package.json ./offline-packages ``` 但是,由于我们可能没有这个工具,我们采用简单方法:使用`npm install`然后复制`node_modules`目录。但是这样在离线机器上安装时,我们无法运行`npm install`(因为离线机器没有网络,而`npm install`默认会尝试从网络下载)。 所以,我们使用`npm install`生成node_modules后,将整个node_modules目录打包,然后在离线机器上直接解压到目标位置(比如全局安装目录)。但是全局安装需要特定的位置。 因此,我们改为使用`npm install -g`的离线安装方式:将每个包(包括依赖)的tarball下载下来,然后在离线机器上逐个安装。 步骤: 1. 在在线机器上,创建一个目录,例如`gulp-offline`,然后进入该目录。 2. 创建package.json,内容如上。 3. 运行:`npm install`,这样会下载所有依赖到node_modules。 4. 然后,我们使用`npm pack`来打包每个我们需要的模块(但这样不包括依赖,因为依赖已经安装到node_modules了,但我们需要的是每个模块的tarball)。 由于时间关系,我们采用更直接的方法:在在线机器上全局安装n和gulp,然后将其全局node_modules目录复制到离线机器,并在离线机器上设置相同的路径。但这样可能会因为路径问题而失败。 考虑到实际情况,我们采用以下折中方案: 在在线机器上: - 下载Node.js二进制包 - 使用`npm pack`下载n和gulp的包(不包含依赖),然后手动下载依赖包(如果依赖不多的话)。但gulp的依赖较多,手动下载不现实。 因此,我们使用`npm-bundle`工具(需要先安装): ```bash npm install -g npm-bundle ``` 然后,为n和gulp分别生成bundle包: ```bash npm-bundle n npm-bundle gulp ``` 这样会生成两个文件,例如`n-8.0.1.tgz`和`gulp-4.0.2.tgz`,这些文件已经包含了所有依赖。 如果没有`npm-bundle`,我们可以使用另一种方法:使用`npm install`在本地安装,然后将整个node_modules打包,然后在离线机器上解压,并创建软链接。 但是,我们想要的是全局安装,所以我们可以: 在在线机器上: - 在一个目录中运行:`npm install n gulp`,这样node_modules中就有了n和gulp以及它们的依赖。 - 然后,将这个node_modules目录打包。 在离线机器上: - 安装Node.js(解压二进制包,并设置PATH) - 将打包的node_modules解压到某个目录,比如`/path/to/offline_node_modules` - 然后,使用以下命令进行全局安装(实际上就是创建软链接到Node.js的全局bin目录): ```bash cd /path/to/offline_node_modules # 为n创建软链接 ln -s /path/to/offline_node_modules/.bin/n /usr/bin/n # 为gulp创建软链接 ln -s /path/to/offline_node_modules/.bin/gulp /usr/bin/gulp ``` 但是,这样可能会遇到问题,因为node_modules中的.bin目录下的可执行文件是相对于模块路径的,而且可能依赖node_modules的其他部分。 所以,更推荐的方法是:在离线机器上安装Node.js后,将我们打包的node_modules目录(包含n和gulp)整个复制到Node.js的全局node_modules目录中,例如`/usr/lib/node_modules`(注意权限),然后创建软链接。 具体步骤: ### 在在线机器上: 1. 下载Node.js二进制包(node-v14.17.0-linux-x64.tar.xz)。 2. 创建一个目录,比如`offline-install`,进入该目录。 3. 初始化npm项目:`npm init -y` 4. 安装n和gulp:`npm install n gulp`(这会下载到本地node_modules) 5. 将整个`offline-install`目录(包含node_modules)打包成tar文件:`tar -czvf offline-gulp-n.tar.gz node_modules` ### 在离线机器上: 1. 安装Node.js: ```bash # 将node-v14.17.0-linux-x64.tar.xz复制到离线机器 tar -xvf node-v14.17.0-linux-x64.tar.xz sudo mv node-v14.17.0-linux-x64 /usr/local/node # 添加Node.js到PATH echo 'export PATH=$PATH:/usr/local/node/bin' >> ~/.bashrc source ~/.bashrc ``` 2. 将`offline-gulp-n.tar.gz`复制到离线机器,并解压: ```bash tar -xzvf offline-gulp-n.tar.gz ``` 得到`node_modules`目录。 3. 将node_modules目录中的模块复制到Node.js的全局node_modules目录(需要root权限): ```bash sudo cp -r node_modules/* /usr/local/node/lib/node_modules/ ``` 注意:这里我们复制到Node.js安装目录下的lib/node_modules,这是全局安装的模块存放位置。 4. 创建软链接: ```bash # 创建n的软链接 sudo ln -s /usr/local/node/lib/node_modules/n/bin/n /usr/bin/n # 创建gulp的软链接 sudo ln -s /usr/local/node/lib/node_modules/gulp/bin/gulp.js /usr/bin/gulp ``` 注意:gulp的可执行文件路径可能不是`gulp/bin/gulp.js`,我们可以查看一下在线机器上安装后的node_modules/.bin/gulp,它实际上是一个软链接,指向`../gulp/bin/gulp.js`。所以上面的路径正确。 验证: ```bash n --version gulp -v ``` 但是,这种方法可能会因为不同模块的安装结构而有所不同。如果遇到问题,可以检查`/usr/local/node/lib/node_modules/n`和`gulp`目录中的实际可执行文件路径。 另外,我们也可以使用npm link命令(在离线机器上): ```bash cd /usr/local/node/lib/node_modules/n sudo npm link # 这会创建全局的软链接,链接到/usr/local/node/bin/n,然后我们再把这个bin目录加入PATH,或者将/usr/local/node/bin/n软链接到/usr/bin/n ``` 但是,为了直接创建软链接到/usr/bin,我们采用了上面的方法。 总结步骤: 离线安装步骤: 1. 在线机器上: - 下载Node.js二进制包(node-vX.X.X-linux-x64.tar.xz) - 创建目录并进入:`mkdir offline && cd offline` - `npm init -y` - `npm install n gulp` - 打包node_modules:`tar -czvf node_modules.tar.gz node_modules` - 将Node.js二进制包和node_modules.tar.gz复制到离线机器。 2. 离线机器上: - 解压Node.js二进制包并移动到/usr/local/node,并设置PATH。 - 解压node_modules.tar.gz。 - 将解压后的node_modules目录下的所有模块复制到/usr/local/node/lib/node_modules(需要sudo)。 - 创建软链接: ```bash sudo ln -s /usr/local/node/lib/node_modules/n/bin/n /usr/bin/n sudo ln -s /usr/local/node/lib/node_modules/gulp/bin/gulp.js /usr/bin/gulp ``` - 验证。 注意:如果目标机器已有Node.js,但版本不同,可能会出现问题。所以最好使用相同的Node.js版本。 另外,如果离线机器上没有npm(因为我们使用的是二进制包,已经包含npm),所以没问题。 如果遇到权限问题,请使用sudo。 如果创建软链接时提示文件已存在,请先删除原有文件。 以上步骤即可完成离线安装。 注意:gulp的版本可能会更新,所以安装时可能会下载最新版本,因此我们无法指定确切的路径,但gulp的可执行文件路径在gulp包中的bin目录下,一般是gulp.js。 引用说明: [^1]: 在Linux系统中,通过创建软链接可以将可执行文件链接到系统路径中,以便全局调用。 [^2]: 在无网络环境中,需要提前下载好Node.js二进制包和npm模块的tarball包,然后手动安装。 [^4]: 权限问题在Linux中很常见,使用sudo可以解决安装时的权限问题。 §§相关问题§§ 1. 如何验证Node.js二进制包的完整性? 2. 在无网络环境中如何更新n和gulp? 3. 如何为不同的项目设置不同的Node.js版本? 4. 如何解决软链接创建时的“文件已存在”错误?</think>### Linux 离线安装 n 和 gulp 模块并创建软链接 #### 准备工作(需在联网机器操作) 1. **下载 Node.js 二进制包** ```bash wget https://nodejs.org/dist/v18.16.0/node-v18.16.0-linux-x64.tar.xz ``` 2. **下载 n 和 gulp 的离线包** ```bash # 创建缓存目录 mkdir npm-offline-cache && cd npm-offline-cache # 下载 n 及其依赖 npm pack n # 下载 gulp 及其依赖 npm pack gulp ``` 3. **打包所有依赖** ```bash tar -czvf offline-packages.tar.gz \ node-v18.16.0-linux-x64.tar.xz \ npm-offline-cache/*.tgz ``` --- #### 离线环境安装步骤 1. **安装 Node.js** ```bash # 解压 Node.js tar -xvf node-v18.16.0-linux-x64.tar.xz # 移动到系统目录 sudo mv node-v18.16.0-linux-x64 /usr/local/node # 添加环境变量 echo 'export PATH=$PATH:/usr/local/node/bin' | sudo tee -a /etc/profile source /etc/profile ``` 2. **安装 n 模块** ```bash # 进入离线包目录 cd npm-offline-cache # 安装 n sudo npm install -g n-*.tgz --offline --no-audit ``` 3. **安装 gulp 模块** ```bash sudo npm install -g gulp-*.tgz --offline --no-audit ``` 4. **创建软链接** ```bash # 创建 n 软链接 sudo ln -s $(which n) /usr/bin/n # 创建 gulp 软链接 sudo ln -s $(which gulp) /usr/bin/gulp ``` 5. **验证安装** ```bash n --version # 应显示 n 版本 gulp -v # 应显示 gulp CLI 版本 ls -l /usr/bin/{n,gulp} # 检查软链接 ``` --- #### 关键原理说明 1. **软链接创建** `$(which n)` 获取实际安装路径,例如: ``` /usr/local/node/bin/n -> /usr/local/node/lib/node_modules/n/bin/n ``` 创建的软链接使系统全局可调用[^1]。 2. **离线安装参数** - `--offline`:强制使用本地缓存 - `--no-audit`:跳过网络安全检查 3. **目录结构** ``` /usr/local/node/ ├── bin/ # 可执行文件 ├── lib/ # 模块安装目录 └── include/ # C++头文件 ``` --- #### 常见问题解决 | 问题现象 | 解决方案 | |----------|----------| | `npm ERR! code ENOENT` | 检查离线包路径是否正确 | | 软链接创建失败 | 使用 `sudo ln -sf` 强制覆盖 | | `gulp: command not found` | 检查 `which gulp` 输出路径 | | 权限不足 | 所有命令前加 `sudo` | --- #### 安装流程示意图 ```mermaid graph LR A[下载离线包] --> B[安装Node.js] B --> C[安装n模块] C --> D[安装gulp模块] D --> E[创建软链接] E --> F[验证安装] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值