Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

npm developer guide #29

Open
XXHolic opened this issue Feb 5, 2019 · 0 comments
Open

npm developer guide #29

XXHolic opened this issue Feb 5, 2019 · 0 comments

Comments

@XXHolic
Copy link
Owner

XXHolic commented Feb 5, 2019

目录

引子

npm Getting started 之后,发现了 npm-developers 这篇文档,介绍从开始、本地测试、打包到发布的一个相对完整的流程。感觉是 Getting started 的一个补充,于是就把篇文档翻译成中文,加深下印象。

原文:npm-developers

简述

所以,你已经打算使用 npm 来开发(并且可能发布或部署)你的项目了。

太棒了!

在你的用户安装程序的简单步骤之上,您需要做一些事情。

关于这些文档

这些是手册页。如果你安装了 npm,你应该可以在 npm 手册中找到特定主题的文档,或者通过 npm 帮助来获取相同的信息。

一个 package 是什么

一个 package 是:

1. 一个包含了描述程序的 package.json 文件的文件夹。
2. 包含有一个 gzip 压缩的压缩包(在 1 的基础上)。
3. 一个解析为(2)中包的 url。
4. 一个已经在登记处发布的 <name>@<version>(在 3 的基础上)。
5. 一个指向的(4)的 <name>@<tag>。
6. 一个满意的有 “latest” 标签的 <name>(在 5 的基础上)。
7. 一个克隆的 git 仓库链接,指向(1)中的文件夹。

即使你从来没有发布过你的包,如果你只是想写一个 node 项目,或者在打包成压缩包后,你想在其它地方能很容易的安装,你仍然可以从使用 npm 中受益匪浅。

Git 的链接可是下面的一些形式:

git://github.com/user/project.git#commit-ish
git+ssh://user@hostname:project.git#commit-ish
git+http://user@hostname/project/blah.git#commit-ish
git+https://user@hostname/project/blah.git#commit-ish

commit-ish 可以是任何的 tag、sha 或者能够提供给 git checkout 作为参数的分支名。默认值是 master

package.json 文件

你需要在项目根目录下有个 package.json 文件,这样才能用 npm 做很多事情。这基本上就是整个交接口。

详细的文件信息,可见 package.json。你至少需要知道的有:

  • name:这个应该是标识你项目的字符串。请不要使用 name 来指明这个项目是基于 node 或者使用了 JavaScript。你可以用 “engines” 字段来表明你项目,需要什么版本的 node(或者其它什么),它几乎假设是 JavaScript。
    也不需要匹配你的 github 库的名称。
    因此,node-foobar-js 是不好的命名。foobar 的命名会更好。
  • version:semver 兼容版本。
  • engines:指明你的项目基于那个版本 node(或其它什么) 运行。node API 改变很频繁,你依赖的版本,可能有一些 bug 或新的功能。明确的指出来。
  • author:作者。
  • scripts:如果你有特定的编译或安装脚本,那么你应该把它放到 scripts 对象中。你应该至少有一个基本的 smoke test 命令作为 “scripts.test” 字段。见 npm-scripts
  • main:如果你有一个单独的模块作为你程序的入口(就像 “foo” 包通过 requre("foo") 获取),那么你需要在 “main” 字段指明。
  • directories:这是一个映射名称到文件夹的对象。最好包括 “lib” 和 “doc”,但是如果你使用 “man” 指定一个满是手册页的文件夹,它们将会像安装这些手册页一样进行安装。

你可以在你项目的根目录下,使用 npm init 初始化基本的 package.json 文件。更多信息见 npm-init

过滤文件

使用 .npmignore 文件排除包中的一些东西。如果没有 .npmignore 文件,但有 .gitignore 文件,那么 npm 将忽略该文件中匹配到的东西。如果你想包含你 .gitignore 文件中排除的文件,你可以创建一个空的 .npmignore 文件覆盖它。与 git 一样,npm 在包的所有子目录中查找 .npmignore.gitignore 文件,而不仅仅是根目录。

.npmignore.gitignore 遵循相同的规则模式:

  • # 开始的行会被忽略。
  • 标准的全局模式有效。
  • 你可以使用正斜杠结束模式 / 指定目录。
  • 你可以通过使用感叹号 !来否定一个模式。

默认的,下面的路径和文件会被忽略,因此不需要额外将这些添加到 .npmignore 中:

  • .*.swp
  • ._*
  • .DS_Store
  • .git
  • .hg
  • .npmrc
  • .lock-wscript
  • .svn
  • .wafpickle-*
  • config.gypi
  • CVS
  • npm-debug.log

此外,node_module 中所有的东西会被忽略,除了绑定的依赖。npm 会自动为你处理这个。所以不必将 node_module 加入到 .npmignore 中。

下面的路径和文件绝不会被忽略,所以把这些加入到 .npmignore 中没有意义:

  • package.json
  • README (and its variants)
  • CHANGELOG (and its variants)
  • LICENSE / LICENCE

如果考虑到项目的结构,你发现 .npmignore 是一个维护难题,那么可以尝试填充 package.json 文件的 files 属性,该属性是一个数组,里面是应该包含在包中的文件或目录名。有时候白名单比黑名单更容易管理。

测试你的 .npmignore 或文件配置是否有效

如果你想要再次确认,当发布时,你想要的都包含在包中,你可以本地运行 npm pack 命令,这个命令将在工作目录生成一个压缩包,发布包也是使用这种方式。

Link 包

npm link 旨在安装一个开发包并实时查看更改,而不用再次重新安装。(当然,你需要重新 link 或 npm rebuidl -g 来更新编译的包。)

实际操作见本地包调试 :npm link ,文档信息见 npm-link

发布之前:确保你的包可正常安装运行

这很重要。

如果你的包不能本地安装,你试图发布它,将会有问题。或者更糟糕的是,你能发布,但发布了一个破损或者无意义的包。所以不要这样做。

在你包的根目录下,执行下面命令:

npm install . -g

这将会告诉你是否可行。如果你更喜欢创建一个 link 的包,指向你的工作目录,那么这么做:

npm link

使用 npm ls -g 查看是否存在。

测试本地安装,到另外一个文件夹下,执行:

cd ../some-other-folder
npm install ../my-package

在其它地方,本地安装到 node_module 文件夹下。

然后进入 node-repl,尝试使用 require(“my-thing”)引入你模块的主模块。

创建一个用户账户

通过 adducer 命令创建一个用户。像这样运行:

npm adduser

之后就根据提示进行。详细见 npm-adduser

发布你的包

这部分很简单。到你文件夹根目录下,执行这个:

npm publish

你可以给一个压缩包,一个压缩包的文件名,或者一个文件夹的路径发布一个 url。

请注意,默认情况下,文件夹里面几乎所有的内容将会被公开。所以,如果你在里面有秘密的东西,使用一个 .npmignore 文件列出要全局忽略的东西,或者从一个新的 checkout 发布。

参考资料

🗑️

最近听了杨照主讲的《史记》音频,感觉真是精彩。

里面对司马迁“究天人之际,通古今之变,成一家之言”的解读真是让人印象深刻。

如果穷尽了人世的道理,但仍然没有办法解释,那就叫做

究天人之际,就是要把天的部分和人的部分彻彻底底地隔绝开来,用这种方法把天隔开,我们在人世的判断才不会受到干扰。如果你相信天的这些偶然,你就不会相信原则,你就看不到人世的教训,也就不会相信人世的道理。

通古今之变,是要我们超越表面上的变化的现象,而去探究历史的原理和原则。

成一家之言,司马迁想说的是,自己所写的《史记》不是一个定论,更不会是一个标准答案,历史没有标准答案。

更加详细的信息,可以去听听,很精彩。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant