最近在写一个新的 JavaScript 库,叫做 dice-chance
,用来分析掷骰子的概率。计划是库写完了就用 PWA 封装一下发布给大家用。因为在写的时候用到了 Flow 做类型声明,所以源代码文件不能不经处理直接被调用,必须经过 flow-remove-types
处理一下删除 Flow 类型声明。
为了保证在包发布时 Flow 类型会被删除掉,我在 package.json
中定义了 build
脚本,然后设置了 prepublish
事件触发 build
脚本:
"scripts": {
"build": "flow-remove-types src/ -d lib/",
"prepublish": "yarn run build"
},
奇怪的是,在执行 npm publish
时我明明看到了 build
脚本被触发了但打包时却没有引入 lib
目录。这样打包出来的库不能用,因为 index.js
里面引用的文件都来自于 lib
目录而非 src
目录。打包时的输出时这样子的:
$ npm publish --dry-run
> dice-chance@2.0.1 prepublish .
> npm run build
> dice-chance@2.0.1 build .
> flow-remove-types src/ -d lib/
src/Analyzer.js
↳ lib/Analyzer.js
src/DiceChance.js
↳ lib/DiceChance.js
src/Parser.js
↳ lib/Parser.js
src/Tokens.js
↳ lib/Tokens.js
src/__tests__/Analyzer-test.js
↳ lib/__tests__/Analyzer-test.js
src/__tests__/DiceChance-test.js
↳ lib/__tests__/DiceChance-test.js
src/__tests__/Parser-test.js
↳ lib/__tests__/Parser-test.js
npm notice
npm notice 📦 dice-chance@2.0.1
npm notice === Tarball Contents ===
npm notice 1.1kB package.json
npm notice 48B .babelrc
npm notice 58B .flowconfig
npm notice 232B .travis.yml
npm notice 48B index.js
npm notice 1.1kB LICENSE
npm notice 1.5kB README.md
npm notice 112.4kB yarn.lock
npm notice 6.1kB src/__tests__/Analyzer-test.js
npm notice 2.8kB src/__tests__/DiceChance-test.js
npm notice 2.6kB src/__tests__/Parser-test.js
npm notice 2.0kB src/Analyzer.js
npm notice 1.4kB src/DiceChance.js
npm notice 1.3kB src/Parser.js
npm notice 949B src/Tokens.js
npm notice === Tarball Details ===
npm notice name: dice-chance
npm notice version: 2.0.1
npm notice package size: 37.7 kB
npm notice unpacked size: 133.7 kB
npm notice shasum: 5d7c0aca59b63aef43e32885fd7d254676a6db8f
npm notice integrity: sha512-4kzv5srVKgrYJ[...]ynoZKx48wAKfw==
npm notice total files: 15
npm notice
+ dice-chance@2.0.1
这到底是为什么呢?一番搜索后我才发现,NPM 默认会用 .gitignore
来决定打包时忽略哪些文件。因为 lib
是构建的产物,不应该属于源代码的一部分,所以我用 .gitignore
文件把 lib
目录忽略掉了。NPM 因此在打包时也把 lib
忽略掉了,但其实 lib
必须被打包,而 src
反而可以被忽略掉(因为 src
中的源文件不会被 index.js
引用。
为了解决这个问题,我需要引入 .npmignore
文件。这个文件的格式跟 .gitignore
的格式一致,只要这个文件存在 NPM 打包时就用它来决定忽略什么,不再理会 .gitignore
。我把 .gitignore
先复制为 .npmignore
,再把里面的 lib
替换成 src
,然后打包就再也没有问题了。以下是正确的打包输出:
$ npm publish --dry-run
> dice-chance@2.0.1 prepublish .
> yarn run build
yarn run v1.12.1
$ flow-remove-types src/ -d lib/
src/Analyzer.js
↳ lib/Analyzer.js
src/DiceChance.js
↳ lib/DiceChance.js
src/Parser.js
↳ lib/Parser.js
src/Tokens.js
↳ lib/Tokens.js
src/__tests__/Analyzer-test.js
↳ lib/__tests__/Analyzer-test.js
src/__tests__/DiceChance-test.js
↳ lib/__tests__/DiceChance-test.js
src/__tests__/Parser-test.js
↳ lib/__tests__/Parser-test.js
✨ Done in 0.26s.
npm notice
npm notice 📦 dice-chance@2.0.1
npm notice === Tarball Contents ===
npm notice 1.1kB package.json
npm notice 48B .babelrc
npm notice 58B .flowconfig
npm notice 232B .travis.yml
npm notice 48B index.js
npm notice 1.1kB LICENSE
npm notice 1.5kB README.md
npm notice 112.4kB yarn.lock
npm notice 6.1kB lib/__tests__/Analyzer-test.js
npm notice 2.8kB lib/__tests__/DiceChance-test.js
npm notice 2.6kB lib/__tests__/Parser-test.js
npm notice 2.0kB lib/Analyzer.js
npm notice 1.4kB lib/DiceChance.js
npm notice 1.3kB lib/Parser.js
npm notice 949B lib/Tokens.js
npm notice === Tarball Details ===
npm notice name: dice-chance
npm notice version: 2.0.1
npm notice package size: 37.6 kB
npm notice unpacked size: 133.7 kB
npm notice shasum: 218703ab30ffad27bc76c1c9a6a2852838e0fb58
npm notice integrity: sha512-gammoNvPgDcyd[...]BpngI1zA2X7dg==
npm notice total files: 15
npm notice
+ dice-chance@2.0.1
没有评论:
发表评论