NodeJS 如何测试一个'npm发布'的结果,而不实际发布到NPM?

sr4lhrrt  于 2023-01-25  发布在  Node.js
关注(0)|答案(5)|浏览(174)

我遇到的一个常见问题是,有时我的.npmignore文件过于激进,我忽略了实际上要包含在NPM压缩包中的文件。
我的问题是--有没有一种方法可以测试NPM发布的结果,而不需要实际发布到NPM?
我的想法是这样的:假设我有一个本地NPM包,包名为“foo”

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的时候复制所有的测试文件(包括fixture等),它可能会起作用。

aydmsdu9

aydmsdu91#

只需运行

npm publish --dry-run

或者,使用当前目录中的tarball生成

npm pack

npm 6和更高版本中,这些将显示将要上传的文件。

wgxvkvu9

wgxvkvu92#

我会详细说明我的评论,我张贴更早,(感谢 Alexandria 米尔斯)。
我是一个verdaccio的贡献者,所以,我密切关注谁在实现verdaccio以及如何实现verdaccio,我将描述我发现的一些有趣的或有效的例子(主要是e2e)。

创建React应用程序

到目前为止,最流行的集成。让我给予你一些背景,他们正在使用lerna,并有多个包,需要测试之前,发布到主注册表aka(npmjs)。我会quote here Dan Abramov解释他们使用custon注册表的原因。
script is self-explanatory,但让我强调一些部分。

+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-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并运行测试作为最后一步,我不能说太多细节,因为我只是粗略地看到它,但我知道它是做什么的。

Mozilla中微子

这是work in progress,但是,在这里提到它也很有趣。

+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进行烟雾测试,并且在create-react-app的同一线程中有plans to integrate a registry with Babel 7 . I quote Henry Zhu early this year talking about babel-smoke-tests
实验名为babel-smoke-testsbabel-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/

mnemlml8

mnemlml83#

我也遇到了同样的问题,所以我创建了一个名为package-preview的软件包。
1.打包你的软件包(这是npm在发布前所做的)
1.在临时位置安装软件包
1.将软件包链接到项目的node_modules
这就允许你在测试中基本上要求软件包作为依赖项,所以在“awesome-pkg”的测试中,你可以写require('../lib')而不是require('awesome-pkg')
我在所有的pnpm repos中使用了这个包几个月,它工作得非常好。我还发布了一篇关于这个包的文章,解释了它可以捕捉到的所有不同的错误:Never ever forget to install a dependency

oymdgrw7

oymdgrw74#

参考npm文件:
[--dry-run]从npm@6开始,除了实际发布到注册表之外,发布的所有内容都可以吗?报告将要发布的内容的详细信息。
与--dry-run类似,参见npm pack,它计算出要包含的文件,并将它们打包成一个tarball文件上传到注册表中。
https://docs.npmjs.com/cli/v6/commands/npm-publish#description

edqdpe6u

edqdpe6u5#

我看到太多复杂的答案,但根据文档,您只需要全局安装您的本地包(因为它将安装在不同的目录下)
转到模块根目录并执行以下操作

npm install . -g

相关问题