【npm link】Node命令中的npm link命令的使用,还有CLI全局命令的使用,开发命令行工具必不可少的部分

news2025/1/19 2:28:07

在这里插入图片描述

😁 作者简介:一名大四的学生,致力学习前端开发技术
⭐️个人主页:夜宵饽饽的主页
❔ 系列专栏:NodeJs
👐学习格言:成功不是终点,失败也并非末日,最重要的是继续前进的勇气

​🔥​前言:

本文是关于Node命令中的npm link命令的详细使用,还有脚手架的背后原理,如果我们需要开发命令行工具或者脚手架时,npm link的使用是必不可少的一环,有关环境变量部分大家一定要好好理解,希望可以帮助到大家,欢迎大家的补充和纠正

文章目录

  • Node命令
    • 1.CLI全局命令
      • 1.1 环境变量
      • 1.2 npm安装全局指令流程
      • 3.package.json里的bin字段
    • 2.npm link
      • 2.1作为npm包被其他包引用
        • 在开发调试的包中执行npm link
        • 在项目中执行npm link
      • 2.2 作为命令行工具需要直接在终端调用
    • 最后

Node命令

1.CLI全局命令

当我们安装一个npm包之后,我们可以再电脑的任意终端使用这个npm包提供的指令,例如:当我们安装了nest npm install -g @nestjs/cli ,我们就可以在任意地方使用nest这个指令,例如:

nest new my-nest-project ,就会帮我们创建一个名字叫 my-nest-project的nest项目,这是怎么做到的呢?

1.1 环境变量

我们做格知识准备,先了解一下什么是环境变量。

环境变量就是Window一个命令执行路径:

echo %PATH%

C:\Program Files\Java\jdk1.8.0_261\bin;C:\Program Files\Git\bin;C:\Windows\System32;...

上面打印出来的就是环境变量,其中有我们熟悉的java文件执行,Git指令等,当我们在终端执行某一个指令时,其会在这些路径下面寻找是否有对应的可执行文件。有就会执行,没有就报错(错误信息:不是内部或外部命令,也不是可运行的程序或批处理文件)

1.2 npm安装全局指令流程

我们在执行npm install -g @nestjs/cli之后,就可以启动nest全局命令,这是因为在环境变量的路径下创建创建了一个nest文件

//可以使用下面这个命令查询Node全局安装指令的位置。
//注意输出的位置,这个位置很重要,下文会经常用到
npm bin -g
// C:\Users\AppData\Roaming\npm

在这个输出的路劲下,可以看到nest文件

在这里插入图片描述

这个文件会中有指向具体执行的npm包的位置:/node_modules/@nestjs/cli/bin/nest.js

所以总的执行流程可以感觉到:

输入一个nest指令 -> 在环境变量中寻找 ->找到nest可执行文件 ->执行/node_modules/@nestjs/cli/bin/nest.js 文件

3.package.json里的bin字段

我们来看nestjs包中的package.json,可以发现一个重点:

nestjs中的package.json中的bin字段

我们可以注意到与上面指令真正执行的文件是一致的,所以最终执行的是bin/nest.js

2.npm link

上面说的是全局安装包的模式,那如果是还在本地开发的包呢,我们不能每改一点东西就发到线上,然后安装下来再验证吧,这时候就需要使用npm link了

我们使用npm link主要分为两种功能:

  • 一个是这个npm包需要被其他的包引用
  • 一个是这个npm包作为命令行工具直接再终端用指令执行

2.1作为npm包被其他包引用

场景:假设我们有两个包,分别是a和b,b是我们本地在开发的调试包,a是我们的项目,a需要引用到b

这个场景我们分为两步来实现:

  • 在b中使用npm link
  • 在a中使用这个b包
在开发调试的包中执行npm link

我们在b的目录下执行npm link,这个时候会发现在C:\Users\AppData\Roaming\npm\node_modules目录下会生成一个链接文件,名字就是package.json中的name

在这里插入图片描述

在项目中执行npm link

当我们在b中执行npm link之后,已经在全局npm包中生成了一个目录,所以我们可以在开发项目的a包中安装b,只要在a包中执行npm link b

在这里插入图片描述

这时候我们就在a项目中使用require('b')的时候,会通过项目下的node_module找到b,而这个b文件可以注意到后面的一个箭头,表示这个b文件会引用到实际的b中,有点像网页中的链接一样的感觉

我们现在可以来理一下流程:
😄 总结:当我们在a中执行npm link b命令的时候,系统会去 C:\Users\AppData\Roaming\npm\node_modules 这个目录下寻找有没有b文件(或者链接文件),那么刚好我们在b目录下执行的npm link时会在上面的路径中生成b的链接文件,所以这个命令执行的关系时:a/node_module/b -> C:\Users\AppData\Roaming\npm\node_modules/b -> 真正的b文件

2.2 作为命令行工具需要直接在终端调用

这种功能的实现,一般来说都是命令行工具,脚手架之类的,可以直接在终端输入指令来执行项目主文件,就像nest.js一样,在终端输入nest就会执行nest脚手架项目中的主文件来生成项目框架

我们在a文件中输入node link 会在C:\Users\AppData\Roaming\npm\node_modules 路径下生成a文件的链接,而且还会在外一层的目录生成指令文件 例如:

在这里插入图片描述

上面中可以看到,执行npm link命令之后,在package.json中的bin对象下的"a-cmd": "./index.js" 键值被使用,之后我们可以在命令行使用a-cmd命令,而这个命令会去执行index.js文件。

我们接下来看 C:\Users\AppData\Roaming\npm中是什么样子:

在这里插入图片描述

从上图可以看到终端中有了像nest指令一样的a-cmd指令,当在终端输入该执行后,会执行index.js文件

在这里插入图片描述
成功输出语句

最后

🌼建议: 本文的要结合实操性去理解,希望大家自己手动操作一遍哪些npm link知识点,相信你会收获更多的

😁 笔者会继续更新前端的知识,目前已有两个大专栏,如果感兴趣,不妨关注一下吧!谢谢 ! 🌱

  • JavaScript小贴士:有关javaScritp中的小的知识点,有点像知识碎片
  • JavaScript进阶指南 :里面是javaScritp中的一个大知识点,例如:原型,this指向,模块,各种类型知识扩展等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1370401.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux网络的命令和配置

目录 一、网络配置命令 1、配置和管理网络接口 1.1 ifconfig 1.2 ip 1.2.1 ip link 1.2.2 ip addr 1.3 修改网络接口名 1.3.1 临时修改网络接口名 1.3.2 永久修改网络接口名 1.4 永久配置单网卡 1.5 永久配置双网卡 1.6 ethtool 2、查看和设置主机中路由表信息…

使用kubesphere的devops部署SpringCloud项目

devops部署SpringCloud项目 环境说明部署流程创建DevOps工程填写流水线信息创建流水线jenkinsfileDockerfiledeploy.yaml 环境说明 已经安装kubesphere的devops组件安装教程可参考官方文档:https://v3-1.docs.kubesphere.io/zh/docs/pluggable-components/devops/ 部署流程 创…

Ubuntu系统下安装TDengine Database

记录一下使用Ubuntu系统的安装TDengine Database管理软件工具 先查看一下系统的版本,可以看到这里使用的是Ubuntu20.04版本,版本代号focal mywmyw-S451LN:~$ uname -a Linux myw-S451LN 6.2.0-39-generic #40~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Thu …

一键搭建elk

一键启动elk 1. 生成环境的脚本 setup.sh #!/usr/bin/bash# logstash enviroment mkdir -p logstash touch logstash/logstash.conf # shellcheck disableSC1078 echo input {tcp {mode > "server"host > "0.0.0.0"port > 4560codec > jso…

Kubernetes WebHook 入门 -- 入门案例: apiserver 接入 github

博客原文 文章目录 k8s 集群配置介绍Admission WebhookWebHook 入门实践: github 认证接入web 服务器Dockerfile 镜像制作amd64x86_64构造镜像检验镜像 Makefilewebhook 接入 apiserverwebhook.yamlapiserver 挂载 webconfig在 github 中创建认证 token将 token 添加到 kubecon…

以某一web系统为测试对象(若依RuoYi为例)-软件测试实验报告作业

题目:以某一 web系统为测试对象,完成以下文档的编写(满分 100分) (1)产品规格说明书 (SPEC) 要求:功能完整(完成产品需求 70%以上)、UI 优良 (每个页面均有字段约 束和合理的出错提示)、流程完整 (一一对应功能)流程合理 (处理逻辑非直线) (2)测试计划要求 :测试进…

一、数据结构基本概念

数据结构基本概念 一、数据结构基本概念1.基本概念和术语1.1数据(Data)1.2 数据元素(Data element)1.3 数据项 (Data Item)1.4 数据对象 (Data Object)1.5 数据结构 (Dat…

移除两个双向链表中的重复元素,每个链表中的元素不重复

移除两个双向链表中的重复元素,每个链表中的元素不重复,请给出算法。 ans: 该问题比单向链表要更加复杂一些,必须考虑并更新前向节点的指向情况,具体编码中存在一些难度,加上链表调试相对不容易,因此难度系…

Qt之有趣的数字钟

一.效果 基于网络代码修改,支持时、分、秒;支持滑动、翻页和旋转。 二.实现 #include <QtCore> #include <QPainter> #include <QAction> #include <QWidget> #include <QMainWindow> #include <QTimer> #include <QKeyEvent> #…

React ant table警告:Each child in a list should have a unique “key“ prop.

如下图&#xff1a; 原因 React Ant table表格每一行都需要一个唯一标识来确保不重复&#xff0c;如果不加该属性&#xff0c;就会出现这个警告。 修复 添加这一行&#xff1a; rowKey{(record) > record.id} # id为行idTable代码段&#xff1a; <TabledataSourc…

Armv8-R AArch32 architecture概念学习

提示 该博客主要为个人学习&#xff0c;通过阅读官网手册整理而来&#xff08;个人觉得阅读官网的英文文档非常有助于理解各个IP特性&#xff09;。若有不对之处请参考参考文档&#xff0c;以官网文档为准。阅读该文章&#xff0c;可以先查看AArch64 Exception Model学习&…

消息队列-RockMQ-定时延时发送消息

定时延时发送消息 任务需要延迟一段时间再进行处理。 生产者 public class Producer {public static void main(String[] args) throws Exception {DefaultMQProducer producer new DefaultMQProducer("producer_group");producer.setNamesrvAddr("ip:9876&q…

【从零开始学技术】Fiddler 抓取 https 请求大全

1.Fiddler代理浏览器设置 注意浏览器代理区别 Chrome/IE浏览器使用的都是系统代理设置 在chrome浏览器的设置中搜索代理&#xff0c;可以看到 打开IE浏览器&#xff0c;选择设置->Internet选项 Firefox浏览器使用的是单独的一套代理系统 在Firefox的代理设置中&#xff0c;我…

hadoop自动获取时间

1、自动获取前15分钟 substr(from_unixtime(unix_timestamp(concat(substr(20240107100000,1,4),-,substr(20240107100000,5,2),-,substr(20240107100000,7,2), ,substr(20240107100000,9,2),:,substr(20240107100000,11,2),:,00))-15*60,yyyyMMddHHmmss),1) unix_timestam…

sentinel熔断简单实现

sentinel详细介绍网址 基于qps限流 package mainimport ("fmt"sentinel "github.com/alibaba/sentinel-golang/api""github.com/alibaba/sentinel-golang/core/base""github.com/alibaba/sentinel-golang/core/flow""log"…

CMake入门教程【核心篇】设置和使用缓存变量

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 概述设置缓存变量使用缓存变量更改缓存变量完整代码示例实战使用技巧注意事项总结与分析

STM32-04-STM32时钟树

STM32时钟树 什么是时钟&#xff1f; 时钟是具有周期性的脉冲信号&#xff0c;最常用的是占空比50%的方波。&#xff08;时钟是单片机的脉搏&#xff0c;搞懂时钟走向及关系&#xff0c;对单片机使用至关重要&#xff09;。 时钟树 时钟源 2个外部时钟源 高速外部振荡器(HSE…

Lava多模态大模型调试(基于vscode框架)

文章目录 前言一、整体概括二、launch.json文件配置三、调试展示前言 之前博客这里介绍LLava1.5多模态大模型的安装、训练、预测等。但对于你想查看源码或多或少都有些麻烦,也不利于代码调试。基于此,本文是一篇基于vscode框架调试llava大模型的教程。 一、整体概括 我是在…

再谈前端算法

楔子 – 青蛙跳台阶什么是算法算法实例 &#xff1a; 实现一个LRU缓存 实现 LRUCache扩展&#xff1a; ES6 Map Map的创建和初始化&#xff1a;添加键值对&#xff1a;获取键值对&#xff1a;检查Map中是否存在某个键&#xff1a;删除键值对&#xff1a;遍历Map&#xff1a;获取…

MulticoreWare与Imagination一同按下汽车计算工作负载的“加速键”

中国北京 – 2024年1月8日 - MulticoreWare Inc与Imagination Technologies共同宣布已在德州仪器TDA4VM处理器上实现了GPU计算&#xff0c;不仅使算力提升了约50 GFLOPS&#xff0c;而且还实现了自动驾驶和高级驾驶辅助系统&#xff08;ADAS&#xff09;常见工作负载性能的跃升…