我的编程空间,编程开发者的网络收藏夹
学习永远不晚

install-pkg怎么安装和使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

install-pkg怎么安装和使用

本文小编为大家详细介绍“install-pkg怎么安装和使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“install-pkg怎么安装和使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

正文

通常安装依赖都是通过命令式的方式来安装,有没有想过可以通过编程式的方式来安装依赖呢?

install-pkg是一个用于安装依赖的工具,它可以在不同的环境下安装依赖,比如 npm、yarn、pnpm 等。

使用

install-pkg的使用非常简单,根据README的说明,就通过下面的代码就可以安装依赖了:

import { install } from 'install-pkg'await installPackage('vite', { silent: true })

源码分析

install-pkg的源码非常简单,只有 100 行左右,我们来看看它的实现原理。

根据README的说明,我们可以通过installPackage方法来安装依赖,那么我们先来看看installPackage方法的实现:

installPackage方法在class="lazy" data-src/index.ts文件中,转成 js 代码如下:

import execa from 'execa'import { detectPackageManager } from '.'export async function installPackage(names, options = {}) {  const detectedAgent = options.packageManager || await detectPackageManager(options.cwd) || 'npm'  const [agent] = detectedAgent.split('@')  if (!Array.isArray(names))    names = [names]  const args = options.additionalArgs || []  if (options.preferOffline) {    // yarn berry uses --cached option instead of --prefer-offline    if (detectedAgent === 'yarn@berry')      args.unshift('--cached')    else      args.unshift('--prefer-offline')  }  return execa(    agent,    [      agent === 'yarn'        ? 'add'        : 'install',      options.dev ? '-D' : '',      ...args,      ...names,    ].filter(Boolean),    {      stdio: options.silent ? 'ignore' : 'inherit',      cwd: options.cwd,    },  )}

可以看到是一个异步方法,它接收两个参数,第一个参数是要安装的依赖名称,第二个参数是配置项。

在方法内部,首先通过传入的配置项options来获取packageManager,如果没有传入packageManager,则通过detectPackageManager方法来获取packageManager,如果detectPackageManager方法也没有获取到packageManager,则默认使用npm

来看看detectPackageManager方法的实现:

import fs from 'fs'import path from 'path'import findUp from 'find-up'const AGENTS = ['pnpm', 'yarn', 'npm', 'pnpm@6', 'yarn@berry', 'bun']const LOCKS = {  'bun.lockb': 'bun',  'pnpm-lock.yaml': 'pnpm',  'yarn.lock': 'yarn',  'package-lock.json': 'npm',  'npm-shrinkwrap.json': 'npm',}export async function detectPackageManager(cwd = process.cwd()) {  let agent = null  const lockPath = await findUp(Object.keys(LOCKS), { cwd })  let packageJsonPath  if (lockPath)    packageJsonPath = path.resolve(lockPath, '../package.json')  else    packageJsonPath = await findUp('package.json', { cwd })  if (packageJsonPath && fs.existsSync(packageJsonPath)) {    try {      const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'))      if (typeof pkg.packageManager === 'string') {        const [name, version] = pkg.packageManager.split('@')        if (name === 'yarn' && parseInt(version) > 1)          agent = 'yarn@berry'        else if (name === 'pnpm' && parseInt(version) < 7)          agent = 'pnpm@6'        else if (name in AGENTS)          agent = name        else          console.warn('[ni] Unknown packageManager:', pkg.packageManager)      }    }    catch {}  }  // detect based on lock  if (!agent && lockPath)    agent = LOCKS[path.basename(lockPath)]  return agent}

findUp是一个用于查找文件的工具,它可以从当前目录向上查找文件,直到找到为止。

我们来逐行分析:

const lockPath = await findUp(Object.keys(LOCKS), {cwd})let packageJsonPathif (lockPath)    packageJsonPath = path.resolve(lockPath, '../package.json')else    packageJsonPath = await findUp('package.json', {cwd})

最开始是获取package-lock.jsonyarn.lockpnpm-lock.yaml等文件的路径;

如果找到就好办了,直接在这个文件目录下找package.json文件即可;

如果没找到就继续使用findUp方法来查找package.json文件。

if (packageJsonPath &amp;&amp; fs.existsSync(packageJsonPath)) {    try {        const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'))        // ...    } catch {    }}

如果找到了package.json文件,就读取文件内容,然后解析成 JSON 对象。

if (typeof pkg.packageManager === 'string') {    const [name, version] = pkg.packageManager.split('@')    if (name === 'yarn' && parseInt(version) > 1)        agent = 'yarn@berry'    else if (name === 'pnpm' && parseInt(version) < 7)        agent = 'pnpm@6'    else if (name in AGENTS)        agent = name    else        console.warn('[ni] Unknown packageManager:', pkg.packageManager)}

这里是用过packageManager来判断使用哪个包管理器;

  • 如果packageManageryarn,并且版本号大于1,则使用yarn@berry

  • 如果packageManagerpnpm,并且版本号小于7,则使用pnpm@6

  • 如果packageManageryarnpnpmnpmbun中的一个,则直接使用;

  • 否则就打印一个警告。

// detect based on lockif (!agent && lockPath)    agent = LOCKS[path.basename(lockPath)]

如果没有通过package.json来获取packageManager,则通过lockPath来获取packageManager

这个方法的核心就是通过两个方式来获取packageManager

  • 通过package.json中的packageManager字段;

  • 通过lock文件来获取。

可以说是非常巧妙。

我们继续看installPackage方法:

const detectedAgent = options.packageManager || await detectPackageManager(options.cwd) || 'npm'const [agent] = detectedAgent.split('@')

这里是第一行,就是获取packageManager,和上面讲的方法相辅相成,继续往下看:

if (!Array.isArray(names))    names = [names]

这里是将name统一变成数组,方便后面处理。

const args = options.additionalArgs || []if (options.preferOffline) {    // yarn berry uses --cached option instead of --prefer-offline    if (detectedAgent === 'yarn@berry')        args.unshift('--cached')    else        args.unshift('--prefer-offline')}

这里是处理preferOffline参数,如果设置了这个参数,就会在args中添加--prefer-offline或者--cached参数,因为yarn@berrynpm的参数不一样。

return execa(    agent,    [      agent === 'yarn'        ? 'add'        : 'install',      options.dev ? '-D' : '',      ...args,      ...names,    ].filter(Boolean),    {      stdio: options.silent ? 'ignore' : 'inherit',      cwd: options.cwd,    },  )

这里的命令是根据packageManager来拼接的,yarnnpm的命令不一样,所以需要判断一下。

最后就是执行安装命令了,这里使用了execa来执行命令,这个库的用法和child_process差不多,但是更加方便。

读到这里,这篇“install-pkg怎么安装和使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

install-pkg怎么安装和使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

install-pkg怎么安装和使用

本文小编为大家详细介绍“install-pkg怎么安装和使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“install-pkg怎么安装和使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。正文通常安装依赖都是通
2023-07-04

python怎么安装pip install

要安装pip,首先要确保已经安装了Python。然后可以按照以下步骤进行安装:1. 在浏览器中打开 https://bootstrap.pypa.io/get-pip.py。2. 将网页中的内容复制到一个新的文本文件中,并将文件保存为 `g
2023-10-07

Linux中怎么使用install命令安装软件

在Linux系统中,使用`install`命令安装软件有两种常见的方法:1. 使用包管理器安装:大多数Linux发行版都使用包管理器来管理软件包,可以使用包管理器来安装软件。具体命令根据不同的发行版而有所不同,以下是一些常见的包管理器和相应
2023-09-27

Vue.use()和install怎么用

这篇文章将为大家详细讲解有关Vue.use()和install怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Vue.use()和install用法介绍在vue的main.js中,我们经常使用Vue.
2023-06-29

Linux中apt、yum、dnf和pkg怎么用

这篇文章主要介绍Linux中apt、yum、dnf和pkg怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!包管理系统:简要概述大多数包系统都是围绕包文件的集合构建的。包文件通常是一个存档文件,它包含已编译的二进制
2023-06-16

postgresql怎么安装和使用

这篇文章主要介绍“postgresql怎么安装和使用”,在日常操作中,相信很多人在postgresql怎么安装和使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”postgresql怎么安装和使用”的疑惑有所
2023-06-27

ckplayer怎么安装和使用

安装ckplayer,您可以按照以下步骤进行操作:下载ckplayer的安装包。您可以在ckplayer官方网站上下载最新版的安装包,也可以在其他可信任的网站上获取。解压安装包。将下载的安装包解压到您希望安装ckplayer的目录。配置ck
2023-10-23

Xcode怎么安装和使用

要安装和使用Xcode,您可以按照以下步骤进行操作:前往Mac App Store下载Xcode。打开下载后的Xcode.dmg文件,将Xcode.app文件拖放到“应用程序”文件夹中。打开Xcode应用程序。第一次打开Xcode时,您可能
2023-10-21

flexbuilder怎么安装和使用

Flex Builder是一款用于Adobe Flex开发的集成开发环境(IDE),下面是安装和使用Flex Builder的步骤:安装Flex Builder:1. 首先,确保你的计算机上已经安装了Java Development Kit
2023-09-25

Smokeping怎么安装和使用

要安装和使用Smokeping,您需要按照以下步骤进行操作:1. 安装Smokeping:首先,确保您的系统上已经安装了Perl和Apache web服务器。然后,您可以通过以下命令来安装Smokeping:```sudo apt-get
2023-09-26

xlwings怎么安装和使用

这篇“xlwings怎么安装和使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“xlwings怎么安装和使用”文章吧。Pyt
2023-06-27

GPG怎么安装和使用

本篇内容介绍了“GPG怎么安装和使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!安装 GPGGPG 的使用非常广泛。你在几乎每个发行版的仓
2023-06-27

CocoaPods怎么安装和使用

要安装和使用CocoaPods,您可以按照以下步骤进行操作:1. 打开终端。2. 首先,您需要安装Ruby,可以使用以下命令进行安装:```sudo gem install -n /usr/local/bin cocoapods```3.
2023-08-23

怎么安装和使用Pycharm

这篇文章主要介绍“怎么安装和使用Pycharm”,在日常操作中,相信很多人在怎么安装和使用Pycharm问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么安装和使用Pycharm”的疑惑有所帮助!接下来,请跟
2023-06-02

teraterm怎么安装和使用

要安装和使用Teraterm,您可以按照以下步骤进行操作:1. 下载Teraterm安装包:您可以在Teraterm官方网站(https://ttssh2.osdn.jp/index.html.en)上找到最新的Teraterm版本,并下载
2023-08-24

pigz怎么安装和使用

今天小编给大家分享一下pigz怎么安装和使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。pigz命令可以用来解压缩文件,最
2023-06-27

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录