# npm init

创建 package.json 文件

# 概要

npm init <package-spec> (等同于 `npx <package-spec>`)
npm init <@scope> (等同于 `npx <@scope>/create`)

aliases: create, innit

# 描述

npm init <initializer> 可以用来建立一个新的或现有的 npm 包。

这里的 initializer 是一个名为 create-<initializer> 的 npm 包,它将被 npm-exec 安装,然后执行它的主 bin -- 大概是创建或更新 package.json,并运行其他与初始化相关的操作。

这个 init 命令被转换成相应的 npm exec 操作,如下所示:

  • npm init foo -> npm exec create-foo
  • npm init @usr/foo -> npm exec @usr/create-foo
  • npm init @usr -> npm exec @usr/create
  • npm init @usr@2.0.0 -> npm exec @usr/create@2.0.0
  • npm init @usr/foo@2.0.0 -> npm exec @usr/create-foo@2.0.0

如果省略了初始化器(通过调用 npm init ), init 将退回到原来的 init 行为。它会问您一堆问题,然后编写一个 package.json。它将尝试根据现有的字段、依赖项和选择的选项进行合理的猜测。它严格来说是可添加的,因此它将保留已经设置的任何字段和值。您也可以使用 -y/--yes 来跳过问卷。如果您传递 --scope,它将创建一个作用域包。

注意:如果用户已经全局安装了 create-<initializer> 包,则 npm init 将使用该包。如果你想让npm使用最新版本,或者其他特定版本,你必须指定它:

  • npm init foo@latest # 从注册中心获取并运行最新的 create-foo
  • npm init foo@1.2.3 # 专门运行 create-foo@1.2.3

# 转发附加选项

任何其他选项都将直接传递给命令,因此 npm init foo -- --hello 将映射到 npm exec -- create-foo --hello

为了更好地说明选项是如何转发的,这里有一个更先进的例子,显示了选项同时传递给 npm cli 和 create 包,以下两个命令是等价的:

  • npm init foo -y --registry=<url> -- --hello -a
  • npm exec -y --registry=<url> -- create-foo --hello -a

# 例子

使用以下命令创建一个新的基于 React 的项目 create-react-app

npm init react-app ./my-react-app

使用以下命令创建一个新的 esm 兼容包 create-esm

$ mkdir my-esm-lib && cd my-esm-lib 
$ npm init esm --yes

使用遗留的 init 生成一个普通的旧 package.json:

$ mkdir my-npm-pkg && cd my-npm-pkg
$ git init
$ npm init

在没有任何问题的情况下生成它:

$ npm init -y

# 工作空间的支持

可以使用 workspace 配置选项在项目中创建一个新的工作区。当使用 npm init -w <dir> 时,cli 将创建预期的文件夹和样板文件,同时对你的 package.json 添加一个 "workspaces": [] 属性,以确保新生成的 workspace 被正确设置。

给定一个没有工作空间的项目,例如:

.
+-- package.json

你可以使用遗留的 init 来生成一个新的工作空间:

$ npm init -w packages/a

这将生成一个新的文件夹和 package.json 文件,同时也更新您的顶级 package.json,以将引用添加到这个新的工作空间:

.
+-- package.json
`-- packages
   `-- a
       `-- package.json

工作空间 init 也支持 npm init <initializer> -w <dir> 语法,遵循在本页面初始描述部分解释的相同规则集。与前面使用 create-react-app 创建基于 react 的新项目的例子类似,下面的语法将确保创建新的react 应用程序作为项目中的嵌套工作区,并配置 package.json 来识别它:

npm init -w packages/my-react-app react-app .

这将确保按照预期生成你的 react 应用,一个重要的考虑因素是,npm exec 将在该工作区新创建的文件夹的上下文中运行,这就是为什么在这个例子中,初始化器使用初始化器名称后跟一个点来表示该上下文中的当前目录的原因,例如 react-app .:

.
+-- package.json
`-- packages
   +-- a
   |   `-- package.json
   `-- my-react-app
       +-- README
       +-- package.json
       `-- ...

# 配置

# yes

  • Default: null
  • Type: null or Boolean

对于 npm 可能在命令行中打印的任何提示,自动回答 "yes"。

# force

  • Default: false
  • Type: Boolean

删除了针对副作用、常见错误、不必要的性能下降和恶意输入的各种保护。

  • 允许在全局安装中清除 non-npm 文件。
  • 允许 npm version 命令在不干净的 git 存储库上工作。
  • 允许删除缓存文件夹 npm cache clean
  • 允许安装 engines 声明需要不同版本的 npm 的包。
  • 允许安装 engines 声明需要不同版本的软件包 node,即使 --engine-strict 已启用。
  • 允许 npm audit fix 安装指定依赖范围之外的模块(包括 SemVer-major 的更改)。
  • 允许取消发布已发布包的所有版本。
  • 允许在根项目中安装冲突的 peerDependencies。
  • npm init 中隐式设置 --yes
  • 允许删除 npm pkg 中的现有值。
  • 允许取消发布整个包(不仅仅是单个版本)。

如果您对自己想要做什么没有明确的想法,强烈建议您不要使用此选项!

# scope

  • Default: 当前项目的范围,如果有的话,或者 “”
  • Type: String 为有作用域的注册中心将操作与作用域关联。

# 在登录或退出私有注册中心时使用:

# 登录,将范围链接到自定义注册中心
npm login --scope=@mycorp --registry=https://registry.mycorp.com

# 注销,删除链接和身份验证令牌
npm logout --scope=@mycorp

这会使 @mycorp 被映射到注册中心,以便将来安装根据模式 @mycorp/package 指定的包。

也会使 npm init 创建一个作用域包。

# 接受所有默认值,并创建名为 "@foo/whatever" 的包
# 而不是直接命名为 "whatever"
npm init --scope=@foo --yes

# workspace

  • Default:
  • Type: String (可以设置多次)

启用在当前项目的已配置工作区的上下文中运行命令,同时通过仅运行此配置选项定义的工作区进行过滤。

workspace 配置的有效值如下:

  • 工作区名称
  • 工作区目录的路径
  • 父工作区目录的路径(将导致选择该文件夹中的所有工作区)

npm init 命令设置时,可以将其设置为尚不存在的工作空间的文件夹,以创建文件夹并将其设置为项目中的全新工作空间。

此值不会导出到子进程的环境中。

# workspaces

  • Default: null
  • Type: null or Boolean

设置为 true 将在所有配置的工作区中运行该命令。

显式地将此设置为 false 将导致如下命令 install 完全忽略工作空间。当没有显式设置时:

  • node_modules 树上操作的命令 (install, update, etc.) 时,将把工作区链接到 node_modules 文件夹中。做其他事情的命令 (test, exec, publish, etc.) 将在根项目上操作,除非在 workspace 配置中指定了一个或多个工作空间。

此值不会导出到子进程的环境中。

# workspaces-update

  • Default: true
  • Type: Boolean

如果设置为true, npm cli 将在可能更改安装到 node_modules 文件夹的工作空间的操作之后运行更新。

# include-workspace-root

  • Default: false
  • Type: Boolean

当为某个命令启用工作区时,请包含工作区根目录。

当为 false 时,通过 workspace 配置指定单个工作空间,或通过 workspaces 标志指定所有工作空间,将导致 npm 仅在指定的工作空间上运行,而不是在根项目上运行。

此值不会导出到子进程的环境中。

Last Updated: 4/25/2023, 9:49:29 AM