【规范】统一项目中包管理器的使用

简介: 【规范】统一项目中包管理器的使用

【规范】统一项目中包管理器的使用


背景介绍:


我们这里暂不说各种包管理器的优缺点,在实际开发中遇到的一个问题就是,你本地经常使用cnpm来安装,但Jenkins自动构建用的npm,偶尔就会出现本地开发很正常但是Jenkins构建失败报警了,为了避免类似问题的出现,也应该要将能统一的都统一规范。


实现原理:


  1. 通过preinstall来在执行install前执行指定脚本;
  2. 在preinstall脚本中获取当前执行进程中包管理器的唯一属性;
  3. 确定执行的和预设的是否一致,拦截或者放行。


一、UserAgent方案


  1. 通过npm_config_user_agent来获取当前执行的是包管理器的名称和版本
  2. 通过对比名称来限制非允许的包管理器执行安装


1. npm_config_user_agent:

同开源项目方案:which-pm-runs

npm/6.14.5 node/v14.17.1 win32 x64
yarn/1.22.10 npm/? node/v14.17.1 win32 x64
复制代码


2. 完整脚本:

const allowPM = 'yarn'
const userAgent = process.env.npm_config_user_agent || ''
if (userAgent !== '') {
  const pmName = userAgent.substring(0, userAgent.indexOf('/'))
  if (pmName !== allowPM) {
    console.warn(
      `\u001b[33m This repository requires using ${allowPM} as the package manager for scripts to work properly.\u001b[39m\n`
    )
    process.exit(1)
  }
}
复制代码
{
  "scripts": {
    "preinstall": "node ./preinstall.js"
  }
}
复制代码

1.png


二、ExecPath方案


  1. 通过npm_execpath来获取当前执行的包管理器绝对路径
  2. 通过正则匹配路径中的名称来限制非允许的包管理器执行安装


1. npm_execpath:

同开源项目方案:vue-next,scripts\preinstall.js

C:\Users\OSpoon\AppData\Roaming\nvm\v14.17.1\node_modules\npm\bin\npm-cli.js
C:\Users\OSpoon\AppData\Roaming\npm\node_modules\yarn\bin\yarn.js
复制代码


2. 完整脚本:

const allowPM = 'yarn'
const execpath = process.env.npm_execpath || ''
if (!new RegExp(`${allowPM}`).test(execpath)) {
  console.warn(
    `\u001b[33m This repository requires using ${allowPM} as the package manager for scripts to work properly.\u001b[39m\n`
  )
  process.exit(1)
}
复制代码
{
  "scripts": {
    "preinstall": "node ./preinstall.js"
  }
}
复制代码

2.png


三、only-allow方案


only-allow为pnpm包管理器组织开源限制方案,only-allow内部使用which-pm-runs来获取当前执行的包管理器后再进行判断拦截,仅需在安装依赖后调整scripts中的内容即可,在vite项目中有使用。

{
  "scripts": {
    "preinstall": "npx only-allow yarn"
  }
}
复制代码

3.png



相关文章
|
人工智能 Linux 虚拟化
Linux Centos虚拟机扩容
Linux Centos虚拟机扩容
|
9月前
|
前端开发 算法 Java
(CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
(CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
269 1
|
Go 数据处理
可变参数(Variadic Functions)- 《Go语言实战指南》
Go 语言支持可变参数函数,允许传入不定数量的参数,本质为切片(slice)。可变参数需置于参数列表最后,支持零个或多个参数传入,也可通过 `...` 将已有切片展开。不支持多个可变参数,调用时可直接传参或使用切片操作。适用于求和、拼接等动态数据处理场景,提升函数灵活性。
272 16
|
6月前
|
人工智能 自然语言处理 供应链
拒绝“满头大汗”的工作:看顶级 AI 调度官如何优雅地解决跨部门纠纷
本文提出“AI调度官”新范式,以Agentic Workflow为引擎、RAG构建唯一真理库、LUI+Generative UI实现无情绪协作,将跨部门内耗转化为算法博弈。告别“人肉路由器”,用确定性替代情绪化争执,助力管理者从救火队员跃升为系统建筑师。
324 2
|
存储 弹性计算 监控
阿里云国际代理商购买无忧指南:如何省20%成本享专业服务
企业上云虽是数字化转型的必然选择,但高昂成本常让管理者犹豫。通过阿里云国际授权代理商采购,可享最高20%价格优惠及专业支持。文章解析代理商渠道价值、新用户购买指南、采购注意事项及长期成本管理策略,助企业通过正规渠道实现“购买无忧”,享受全生命周期技术支持与价格红利。选对合作伙伴,为未来竞争力投资。
578 2
|
弹性计算 安全 搜索推荐
阿里云国际站注册教程:阿里云服务器安全设置
阿里云国际站注册教程:阿里云服务器安全设置 在云计算领域,阿里云是一个备受推崇的品牌,因其强大的技术支持和优质的服务而受到众多用户的青睐。本文将为您介绍阿里云国际站的注册过程,并重点讲解如何进行阿里云服务器的安全设置。
750 7
Vue3分割线(Divider)
这是一个可定制的分割线组件,支持多种属性设置,包括标题位置、边距、宽度、样式、颜色及垂直分割等。通过简单的配置即可实现多样化的视觉效果,适用于不同场景下的布局需求。在线预览和详细代码示例可见链接。
808 5
Vue3分割线(Divider)
|
运维 网络协议 Linux
[linux]常见内核TCP参数描述与配置
[linux]常见内核TCP参数描述与配置
1240 0
|
JSON API C#
C# 通过阿里云 API 实现企业工商数据查询
C# 通过阿里云 API 实现企业工商数据查询
|
前端开发
CSS弹性布局justify-content的用法
CSS弹性布局justify-content的用法