iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >install-pkg怎么安装和使用
  • 696
分享到

install-pkg怎么安装和使用

2023-07-04 21:07:45 696人浏览 泡泡鱼
摘要

本文小编为大家详细介绍“install-pkg怎么安装和使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“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方法在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怎么安装和使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: install-pkg怎么安装和使用

本文链接: https://www.lsjlt.com/news/347437.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • install-pkg怎么安装和使用
    本文小编为大家详细介绍“install-pkg怎么安装和使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“install-pkg怎么安装和使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。正文通常安装依赖都是通...
    99+
    2023-07-04
  • 编程式安装依赖install-pkg源码解析
    目录正文使用源码分析总结正文 通常安装依赖都是通过命令式的方式来安装,有没有想过可以通过编程式的方式来安装依赖呢? install-pkg是一个用于安装依赖的工具,它可以在不同的环境...
    99+
    2022-12-25
    编程式安装依赖install-pkg install pkg
  • python怎么安装pip install
    要安装pip,首先要确保已经安装了Python。然后可以按照以下步骤进行安装:1. 在浏览器中打开 https://bootstra...
    99+
    2023-10-07
    python
  • Linux中怎么使用install命令安装软件
    在Linux系统中,使用`install`命令安装软件有两种常见的方法:1. 使用包管理器安装:大多数Linux发行版都使用包管理器...
    99+
    2023-09-27
    Linux
  • Mysql 5.7.22 install for windows怎么安装
    这篇文章给大家分享的是有关Mysql 5.7.22 install for windows怎么安装的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Mysql 5.7.22 inst...
    99+
    2024-04-02
  • php模板没有install怎么安装
    有些 PHP 模板开发者并不把安装过程放在模板包里,所以在使用时,需要手动安装模板。在本文中,我们将为您提供关于在没有 "install" 的情况下安装 PHP 模板的步骤和建议。步骤1:下载模板并解压缩首先,您需要从模...
    99+
    2023-05-14
  • Pip install和Conda install如何使用
    这篇文章主要讲解了“Pip install和Conda install如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Pip install和Conda&...
    99+
    2023-07-05
  • Vue.use()和install怎么用
    这篇文章将为大家详细讲解有关Vue.use()和install怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Vue.use()和install用法介绍在vue的main.js中,我们经常使用Vue....
    99+
    2023-06-29
  • Linux中apt、yum、dnf和pkg怎么用
    这篇文章主要介绍Linux中apt、yum、dnf和pkg怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!包管理系统:简要概述大多数包系统都是围绕包文件的集合构建的。包文件通常是一个存档文件,它包含已编译的二进制...
    99+
    2023-06-16
  • pigz怎么安装和使用
    今天小编给大家分享一下pigz怎么安装和使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。pigz命令可以用来解压缩文件,最...
    99+
    2023-06-27
  • opengl怎么安装和使用
    要安装和使用OpenGL,需要按照以下步骤进行操作:1. 下载和安装OpenGL开发工具包(OpenGL SDK):可以从OpenG...
    99+
    2023-09-14
    opengl
  • flexbuilder怎么安装和使用
    Flex Builder是一款用于Adobe Flex开发的集成开发环境(IDE),下面是安装和使用Flex Builder的步骤:...
    99+
    2023-09-25
    flexbuilder
  • Smokeping怎么安装和使用
    要安装和使用Smokeping,您需要按照以下步骤进行操作:1. 安装Smokeping:首先,确保您的系统上已经安装了Perl和A...
    99+
    2023-09-26
    Smokeping
  • FFmpeg怎么安装和使用
    要安装FFmpeg,可以按照以下步骤进行操作:1. 在FFmpeg官方网站(https://ffmpeg.org/)上下载最新版本的...
    99+
    2023-09-15
    Ffmpeg
  • jQuery怎么安装和使用
    本篇内容介绍了“jQuery怎么安装和使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!JQuery 对象jQuery 是一套兼容多浏览器的...
    99+
    2023-06-27
  • Java13怎么安装和使用
    本篇内容主要讲解“Java13怎么安装和使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java13怎么安装和使用”吧! Java 13 新特性 此版本带...
    99+
    2024-04-02
  • postgresql怎么安装和使用
    这篇文章主要介绍“postgresql怎么安装和使用”,在日常操作中,相信很多人在postgresql怎么安装和使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”postgresql怎么安装和使用”的疑惑有所...
    99+
    2023-06-27
  • Etcher.io怎么安装和使用
    这篇文章主要介绍“Etcher.io怎么安装和使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Etcher.io怎么安装和使用”文章能帮助大家解决问题。Etcher.io ,一个出色的开源项目,可...
    99+
    2023-06-27
  • Xcode怎么安装和使用
    要安装和使用Xcode,您可以按照以下步骤进行操作: 前往Mac App Store下载Xcode。 打开下载后的Xcode...
    99+
    2023-10-21
    Xcode
  • CocoaPods怎么安装和使用
    要安装和使用CocoaPods,您可以按照以下步骤进行操作:1. 打开终端。2. 首先,您需要安装Ruby,可以使用以下命令进行安装...
    99+
    2023-08-23
    CocoaPods
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作