Skip to content

Commit

Permalink
npm: replace 'npm pack' call by 'tar czf'
Browse files Browse the repository at this point in the history
'npm pack' is a maintainer tool which tries to execute 'prepare'
and similar scripts.  This fails usually in OE because it requires
completely installed 'node_modules'.

Earlier nodejs versions supported an undocumented 'ignore-scripts'
option.  This has been removed in nodejs 16.

We could patch 'package.json' and remove the unwanted scripts.  But
this might complicate local workflows (applying patches) and installed
packages will contain the modified 'package.json'.

Instead of, package it manually by 'tar czf'.  As a sideeffect,
'do_configure' is running much faster now.

Signed-off-by: Enrico Scholz <enrico.scholz@sigma-chemnitz.de>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
  • Loading branch information
ensc authored and rpurdie committed Jun 28, 2022
1 parent a5edae1 commit 68b480d
Showing 1 changed file with 29 additions and 6 deletions.
35 changes: 29 additions & 6 deletions meta/classes/npm.bbclass
Original file line number Diff line number Diff line change
Expand Up @@ -57,13 +57,36 @@ def npm_global_configs(d):
configs.append(("cache", d.getVar("NPM_CACHE")))
return configs

## 'npm pack' runs 'prepare' and 'prepack' scripts. Support for
## 'ignore-scripts' which prevents this behavior has been removed
## from nodejs 16. Use simple 'tar' instead of.
def npm_pack(env, srcdir, workdir):
"""Run 'npm pack' on a specified directory"""
import shlex
cmd = "npm pack %s" % shlex.quote(srcdir)
args = [("ignore-scripts", "true")]
tarball = env.run(cmd, args=args, workdir=workdir).strip("\n")
return os.path.join(workdir, tarball)
"""Emulate 'npm pack' on a specified directory"""
import subprocess
import os
import json

src = os.path.join(srcdir, 'package.json')
with open(src) as f:
j = json.load(f)

# base does not really matter and is for documentation purposes
# only. But the 'version' part must exist because other parts of
# the bbclass rely on it.
base = j['name'].split('/')[-1]
tarball = os.path.join(workdir, "%s-%s.tgz" % (base, j['version']));

# TODO: real 'npm pack' does not include directories while 'tar'
# does. But this does not seem to matter...
subprocess.run(['tar', 'czf', tarball,
'--exclude', './node-modules',
'--exclude-vcs',
'--transform', 's,^\./,package/,',
'--mtime', '1985-10-26T08:15:00.000Z',
'.'],
check = True, cwd = srcdir)

return tarball

python npm_do_configure() {
"""
Expand Down

0 comments on commit 68b480d

Please sign in to comment.