diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2018-10-22 23:43:32 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2018-10-25 14:53:44 +0100 |
commit | e9270af4296ce2af292059617a717e42fc17425c (patch) | |
tree | 21efdf44ac3fec4ff49bc3f84e63312e300d4579 | |
parent | 1c03ada82de69a7f04ebb191fa560c02a2d29ea7 (diff) | |
download | poky-e9270af4296ce2af292059617a717e42fc17425c.tar.gz |
npm: change install directory to upstream default
The node binary searches for packages in a number of locations, the last
of which is $PREFIX/lib/node (here: /usr/lib/node) from the list of
GLOBAL_FOLDERS [1]. So change the installation directory for all
packages depending on npm.bbclass to that location. This removes the
need to define the NODE_PATH variable to the non-standard
/usr/lib/node_modules value.
While the Tips for Package Managers [2] discusses installing packages to
/usr/lib/node_modules/<name>/<version>, this has several drawbacks:
* it does not work for the REPL as mentioned in the documentation
* it also does not work for any code _not_ installed as a global
package under /usr/lib/node_modules (e.g. /usr/share/foo.js will not
find any packages below /usr/lib)
* using the non-default location and then having to set NODE_PATH
barely saves any time: there are only two file-system lookups (to the
legacy $HOME/.node_modules and $HOME/.node_libraries) directories
before the library would be found
And the suggestion was made in the context of deduping the node_modules
tree by installing all packages in a flat hierarchy and using symlinks
to the correct version of each dependency. This is not what OpenEmbedded
does, so none of those benefits (deduping, cleaner packages) are being
had by shifting the installation directory to /usr/lib/node_modules.
The choice of a "proper" installation path is not helped by npm
installing to /usr/lib/node_modules if asked to install globally. Still,
using the location expected by nodejs (/usr/lib/node) seems the right
choice.
[1]: https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders
[2]: https://nodejs.org/api/modules.html#modules_addenda_package_manager_tips
(From OE-Core rev: c73bc49038effd64f2c2542c1f4da8b6a4168477)
Signed-off-by: Olaf Mandel <o.mandel@menlosystems.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | meta/classes/npm.bbclass | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/meta/classes/npm.bbclass b/meta/classes/npm.bbclass index d5ff0c6d57..30febcffb2 100644 --- a/meta/classes/npm.bbclass +++ b/meta/classes/npm.bbclass | |||
@@ -10,7 +10,7 @@ def node_pkgname(d): | |||
10 | 10 | ||
11 | NPMPN ?= "${@node_pkgname(d)}" | 11 | NPMPN ?= "${@node_pkgname(d)}" |
12 | 12 | ||
13 | NPM_INSTALLDIR = "${D}${libdir}/node/${NPMPN}" | 13 | NPM_INSTALLDIR = "${libdir}/node/${NPMPN}" |
14 | 14 | ||
15 | # function maps arch names to npm arch names | 15 | # function maps arch names to npm arch names |
16 | def npm_oe_arch_map(target_arch, d): | 16 | def npm_oe_arch_map(target_arch, d): |
@@ -52,9 +52,10 @@ npm_do_install() { | |||
52 | # changing the home directory to the working directory, the .npmrc will | 52 | # changing the home directory to the working directory, the .npmrc will |
53 | # be created in this directory | 53 | # be created in this directory |
54 | export HOME=${WORKDIR} | 54 | export HOME=${WORKDIR} |
55 | mkdir -p ${NPM_INSTALLDIR}/ | 55 | mkdir -p ${D}${libdir}/node_modules |
56 | npm pack . | 56 | npm pack . |
57 | npm install --prefix ${D}${prefix} -g --arch=${NPM_ARCH} --target_arch=${NPM_ARCH} --production --no-registry ${NPMPN}-${PV}.tgz | 57 | npm install --prefix ${D}${prefix} -g --arch=${NPM_ARCH} --target_arch=${NPM_ARCH} --production --no-registry ${NPMPN}-${PV}.tgz |
58 | mv ${D}${libdir}/node_modules ${D}${libdir}/node | ||
58 | if [ -d ${D}${prefix}/etc ] ; then | 59 | if [ -d ${D}${prefix}/etc ] ; then |
59 | # This will be empty | 60 | # This will be empty |
60 | rmdir ${D}${prefix}/etc | 61 | rmdir ${D}${prefix}/etc |
@@ -62,13 +63,13 @@ npm_do_install() { | |||
62 | } | 63 | } |
63 | 64 | ||
64 | python populate_packages_prepend () { | 65 | python populate_packages_prepend () { |
65 | instdir = d.expand('${D}${libdir}/node_modules/${NPMPN}') | 66 | instdir = d.expand('${D}${NPM_INSTALLDIR}') |
66 | extrapackages = oe.package.npm_split_package_dirs(instdir) | 67 | extrapackages = oe.package.npm_split_package_dirs(instdir) |
67 | pkgnames = extrapackages.keys() | 68 | pkgnames = extrapackages.keys() |
68 | d.prependVar('PACKAGES', '%s ' % ' '.join(pkgnames)) | 69 | d.prependVar('PACKAGES', '%s ' % ' '.join(pkgnames)) |
69 | for pkgname in pkgnames: | 70 | for pkgname in pkgnames: |
70 | pkgrelpath, pdata = extrapackages[pkgname] | 71 | pkgrelpath, pdata = extrapackages[pkgname] |
71 | pkgpath = '${libdir}/node_modules/${NPMPN}/' + pkgrelpath | 72 | pkgpath = '${NPM_INSTALLDIR}/' + pkgrelpath |
72 | # package names can't have underscores but npm packages sometimes use them | 73 | # package names can't have underscores but npm packages sometimes use them |
73 | oe_pkg_name = pkgname.replace('_', '-') | 74 | oe_pkg_name = pkgname.replace('_', '-') |
74 | expanded_pkgname = d.expand(oe_pkg_name) | 75 | expanded_pkgname = d.expand(oe_pkg_name) |
@@ -84,7 +85,7 @@ python populate_packages_prepend () { | |||
84 | } | 85 | } |
85 | 86 | ||
86 | FILES_${PN} += " \ | 87 | FILES_${PN} += " \ |
87 | ${libdir}/node_modules/${NPMPN} \ | 88 | ${NPM_INSTALLDIR} \ |
88 | " | 89 | " |
89 | 90 | ||
90 | EXPORT_FUNCTIONS do_compile do_install | 91 | EXPORT_FUNCTIONS do_compile do_install |