我遇到的一个常见问题是,有时我的.npmignore 文件过于激进,我忽略了我实际上要包含在 NPM 压缩包中的文件。
我的问题是 - 有没有办法在不实际发布到 NPM 的情况下测试 NPM 发布的结果?
我在想这样的事情。假设我有一个包名称为"foo"的本地 NPM 包
set -e;
local proj="bar";
local path_to_foo="."
mkdir -p "$HOME/.local.npm"
npm --tarball -o "$HOME/.local.npm" # made up command, but you get the idea
(
cd "$HOME/.temp_projects"
rm -rf "$proj"
mkdir "$proj"
cd "$proj"
npm init -f
npm install "$path_to_foo"
)
copy_test_stuff -o "$HOME/.temp_projects/bar"
cd "$HOME/.temp_projects/bar"
npm test
我认为这行不通。因为我们在 NPM 发布压缩包中包含的任何内容都可能不足以进行完整的测试。但是,如果我们在执行copy_test_stuff
时复制所有测试文件(包括夹具等(,它可能会起作用?
只需运行
npm publish --dry-run
或者,在当前目录中生成压缩包
npm pack
在npm 6
及以上,这些将显示要上传的文件。
我会详细说明我发布的评论,(感谢亚历山大米尔斯(。
我是一个verdaccio
贡献者,所以,我密切关注谁在实施以及如何verdaccio。我将描述我发现的夫妇或示例(主要是e2e(,这些例子可能很有趣或作为一个有效的答案。
创建反应应用程序
到目前为止,最受欢迎的集成。让我给你一些上下文,他们正在使用lerna
并且有多个包需要测试,然后才能在主注册表(又名npmjs
(上发布。我将在这里引用Dan Abramov解释他们使用custon注册表的原因。
脚本是不言自明的,但让我重点介绍一些部分。
+nohup npx verdaccio@2.7.2 &>$tmp_registry_log &
+# Wait for `verdaccio` to boot
+grep -q 'http address' <(tail -f $tmp_registry_log)
+
+# Set registry to local registry
+npm set registry http://localhost:4873
+yarn config set registry http://localhost:4873
+
+# Login so we can publish packages
+npx npm-cli-login@0.0.10 -u user -p password -e user@example.com -r http://localhost:4873 --quotes
# Test local start command
yarn start --smoke-test
+./tasks/release.sh --yes --force-publish=* --skip-git --cd-version=prerelease --exact --npm-tag=latest
如您所见,他们正在运行verdaccio
,而是他们决定使用npm-cli-login
的自定义配置文件,然后他们针对verdaccio运行测试。一切准备就绪后,他们在verdaccio上发布。最后一步,稍后在同一文件中,他们使用自己的应用程序获取包。
PNPM
他们创建了一个名为pnpm-registry-mock的项目,这是一个抽象,允许他们在运行测试之前运行verdaccio。
"pretest:e2e": "rimraf ../.tmp/ && rimraf node_modules/.bin/pnpm && pnpm-registry-mock prepare",
"test:e2e": "preview --skip-prepublishOnly && npm-run-all -p -r pnpm-registry-mock test:tap",
"test": "npm run lint && npm run tsc && npm run test:e2e",
基本上,使用 npm 脚本,他们准备 verdaccio 并在最后一步运行测试。我不能太详细,因为我只是浅薄地看到它。但我知道它的作用。
莫斯拉中微子
这是正在进行的工作,但是,在这里提及也很有趣。
+if [ "$PROJECT" == "all" ]; then
+ yarn link:all;
+ yarn validate:eslintrc;
+ yarn lint;
+ yarn build;
+ yarn test;
+else
+ yarn verdaccio --config verdaccio.yml & sleep 10;
+ yarn config set registry "http://localhost:4873";
+ npm config set registry "http://localhost:4873";
+ .scripts/npm-adduser.js;
+ yarn lerna publish
+ --force-publish=*
+ --skip-git
+ --skip-npm
+ --registry http://localhost:4873/
+ --yes
+ --repo-version $(node_modules/.bin/semver -i patch $(npm view neutrino version));
+ yarn lerna exec npm publish --registry http://localhost:4873/;
+ PROJECT="$PROJECT" TEST_RUNNER="$TEST_RUNNER" LINTER="$LINTER" yarn test:create-project;
+fi
同样,相同的方法,正在构建项目,然后执行verdaccio
并发布所有包。
通天塔.js
我知道 Babel.js 一直在尝试对 Babel 6 进行烟雾测试,并计划将注册表与 Babel 7 集成。我引用亨利·朱(Henry Zhu(今年早些时候在同一条create-react-app
线程中谈论babel-smoke-tests
的话。
该实验称为 babel-smoke-tests,babel-smoke-tests/scripts/test.sh
是您的关键文件。
在这里,我看到了与其他项目相同的模式。他们正在推出verdaccio
然后他们做他们的事情。
START=$(cd scripts; pwd)/section-start.sh
END=$(cd scripts; pwd)/section-end.sh
$START 'Setting up local npm registry' setup.npm.registry
node_modules/.bin/verdaccio -l localhost:4873 -c verdaccio.yml &
export NPM_CONFIG_REGISTRY=http://localhost:4873/
NPM_LOGIN=$(pwd)/scripts/npm-login.sh
$NPM_LOGIN
$END 'Done setting up local npm registry' setup.npm.registry
scripts/bootstrap.sh
export THEM=$(cd them; pwd)
if [[ $SPECIFIC_TEST ]]; then
scripts/tests/$SPECIFIC_TEST.sh
else
scripts/tests/jquery.sh
scripts/tests/react.sh
fi
㯱
首先,我希望我的小研究能给你解决你的问题的新想法。我认为npm pack
解决一些问题,但是使用非常轻巧且易于使用的verdaccio
嘲笑注册表对您来说可能是一个真正的选择。一些大型项目正在(或开始(使用它,它们或多或少遵循相同的方法。那么,为什么不尝试呢?:)
https://www.verdaccio.org/
我遇到了完全相同的问题,所以我创建了一个名为 package-preview 的包。包预览的作用是:
- 打包你的包(这是 npm 在发布之前所做的(
- 在临时位置安装包
- 将包链接到项目的node_modules
这允许您基本上要求包作为测试中的依赖项。所以在"真棒pkg"的测试中,你写require('../lib')
require('awesome-pkg')
我在所有 pnpm 存储库中使用这个包几个月,效果非常好。我还发布了一篇关于这个包的文章,解释了它可以捕获的所有不同错误: 永远不要忘记安装依赖项
参考 npm 文档:
[--dry-run] 截至npm@6,除了发布之外的所有内容都会做什么吗? 实际发布到注册表。报告将要报告的详细信息 已经出版。
与 --dry-run 类似,请参阅 npm pack,它找出要包含的文件并将它们打包到一个压缩包中以上传到注册表。
https://docs.npmjs.com/cli/v6/commands/npm-publish#description
我看到太多复杂的答案,但根据文档,你只需要全局安装你的本地包(因为它将安装在不同的目录上(
转到模块根目录并执行
npm install . -g