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

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

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


背景介绍:


我们这里暂不说各种包管理器的优缺点,在实际开发中遇到的一个问题就是,你本地经常使用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



相关文章
|
7月前
|
资源调度 前端开发 JavaScript
构建高效前端项目:现代包管理器与模块化的深度解析
【2月更文挑战第21天】 在当今快速演变的前端开发领域,高效的项目管理和代码组织已成为成功交付复杂Web应用的关键。本文将深入探讨现代前端包管理器如npm, yarn和pnpm的工作原理,以及它们如何与模块化编程实践(例如CommonJS、ES6模块)协同工作以优化开发流程。我们将剖析这些工具的内部机制,了解它们如何解决依赖冲突,提高安装速度,并保证项目的健壮性。同时,本文还将介绍模块化编程的最佳实践,包括代码拆分、重用和版本控制,帮助开发者构建可维护且性能卓越的前端项目。
|
7月前
|
搜索推荐 Go 开发者
Go模块与依赖管理:构建稳定、可维护的项目生态
【2月更文挑战第9天】Go模块是Go语言从1.11版本开始引入的一个新的依赖管理工具,它改变了以往通过GOPATH管理项目依赖的方式,为Go开发者带来了更加灵活、高效的依赖管理方式。本文将深入探讨Go模块与依赖管理的概念、使用方法和最佳实践,帮助读者更好地理解和应用Go模块,构建稳定、可维护的项目生态。
|
5月前
|
JavaScript API
TypeScript 项目中接口的统一管理
TypeScript 项目中接口的统一管理
68 0
|
监控 前端开发 持续交付
带你入门前端工程(二):统一规范(二)
带你入门前端工程(二):统一规范(二)
169 0
|
前端开发 JavaScript 搜索推荐
带你入门前端工程(二):统一规范(一)
带你入门前端工程(二):统一规范
153 0
|
IDE 前端开发 开发工具
如何方便的为团队所有项目统一 ESLint 配置
近期给团队项目 CLI 做重构,其中涉及到 ESLint 的部分,这部分之前的方式是通过开发和编译时调用 ESLint 的 CLI 去检查项目代码,虽然不会出什么问题,但是各种 IDE 的提示就废掉了,所以打算换一种比较通用的方式。
|
人工智能 Java 编译器
SwiftLint 自动规范代码工具(上)
SwiftLint 自动规范代码工具(上)
504 0
SwiftLint 自动规范代码工具(上)
|
Swift iOS开发
SwiftLint 自动规范代码工具(下)
SwiftLint 自动规范代码工具(下)
613 0
SwiftLint 自动规范代码工具(下)
|
JSON 前端开发 安全
RobotFrameWork接口设计规范
RobotFrameWork接口设计规范
144 0
RobotFrameWork接口设计规范
|
安全 API 开发工具
pkg版本规范管理自动化最佳实践
何为版本?版本即语义版本控制( Semantic version 后面简称为 SemVer )是一种版本控制系统,在过去几年中一直在不断发展。 随着每天都在构建新的插件,插件,扩展和库,拥有通用的软件开发项目版本化方法是一件好事,可以帮助我们跟踪正在发生的事情。
pkg版本规范管理自动化最佳实践