Message ID | 20220925192030.1648496-1-thomas.petazzoni@bootlin.com |
---|---|
State | Accepted |
Headers | show |
Series | [v2,1/2] package/nodejs: add patch to adjust default NodeJS search path | expand |
Hello Thomas, Le 25/09/2022 à 21:20, Thomas Petazzoni a écrit : > By default, NodeJS searches global modules in /usr/lib/node, but NPM > installs them in /usr/lib/node_modules/. Therefore by default, if one > installs modules with BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL, they are > not accessible by NodeJS, unless by passing a > NODE_PATH=/usr/lib/node_modules/ variable. Since this is not obvious, > and it's nicer when things work out of the box, we simply patch NodeJS > to look for modules at the right place. > > See > https://stackoverflow.com/questions/15636367/nodejs-require-a-global-module-package > for some discussions on this topic. Note: The nodejs package has been update to 16.18.1 since your v2 of nodejs series. Reviewed-by: Romain Naour <romain.naour@smile.fr> Best regards, Romain > > Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> > --- > Changes since v1: > - Search for both /usr/lib/node and /usr/lib/node_modules as suggested > by Yann > --- > ...ules-cjs-loader.js-adjust-default-pa.patch | 36 +++++++++++++++++++ > 1 file changed, 36 insertions(+) > create mode 100644 package/nodejs/0004-lib-internal-modules-cjs-loader.js-adjust-default-pa.patch > > diff --git a/package/nodejs/0004-lib-internal-modules-cjs-loader.js-adjust-default-pa.patch b/package/nodejs/0004-lib-internal-modules-cjs-loader.js-adjust-default-pa.patch > new file mode 100644 > index 0000000000..5b93998e5e > --- /dev/null > +++ b/package/nodejs/0004-lib-internal-modules-cjs-loader.js-adjust-default-pa.patch > @@ -0,0 +1,36 @@ > +From a31425bdfcb5d695ab25c3d295898326784cffec Mon Sep 17 00:00:00 2001 > +From: Thomas Petazzoni <thomas.petazzoni@bootlin.com> > +Date: Sun, 25 Sep 2022 11:10:06 +0200 > +Subject: [PATCH] lib/internal/modules/cjs/loader.js: adjust default path to > + search modules > + > +NPM installs modules in /usr/lib/node_modules/, but by default NodeJS > +searches for them only in /usr/lib/node/. We could also set the > +NODE_PATH environment variable, but it is more convienient to have > +NodeJS configured by default to find modules where they are installed. > + > +This issue is discussed at > +https://stackoverflow.com/questions/15636367/nodejs-require-a-global-module-package. > + > +Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> > +--- > + lib/internal/modules/cjs/loader.js | 3 ++- > + 1 file changed, 2 insertions(+), 1 deletion(-) > + > +diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js > +index f1971c40a4..5fe3884156 100644 > +--- a/lib/internal/modules/cjs/loader.js > ++++ b/lib/internal/modules/cjs/loader.js > +@@ -1261,7 +1261,8 @@ Module._initPaths = function() { > + path.resolve(process.execPath, '..') : > + path.resolve(process.execPath, '..', '..'); > + > +- const paths = [path.resolve(prefixDir, 'lib', 'node')]; > ++ const paths = [path.resolve(prefixDir, 'lib', 'node'), > ++ path.resolve(prefixDir, 'lib', 'node_modules')]; > + > + if (homeDir) { > + ArrayPrototypeUnshift(paths, path.resolve(homeDir, '.node_libraries')); > +-- > +2.37.3 > +
Thomas, All, On 2023-02-08 14:51 +0100, Romain Naour spake thusly: > Le 25/09/2022 à 21:20, Thomas Petazzoni a écrit : > > By default, NodeJS searches global modules in /usr/lib/node, but NPM > > installs them in /usr/lib/node_modules/. Therefore by default, if one > > installs modules with BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL, they are > > not accessible by NodeJS, unless by passing a > > NODE_PATH=/usr/lib/node_modules/ variable. Since this is not obvious, > > and it's nicer when things work out of the box, we simply patch NodeJS > > to look for modules at the right place. > > > > See > > https://stackoverflow.com/questions/15636367/nodejs-require-a-global-module-package > > for some discussions on this topic. > > Note: The nodejs package has been update to 16.18.1 since your v2 of nodejs series. > > Reviewed-by: Romain Naour <romain.naour@smile.fr> I could not find the original patch in my mailbox, so I'll reply here: Applied to master, thanks. Regards, Yann E. MORIN. > Best regards, > Romain > > > > > > Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> > > --- > > Changes since v1: > > - Search for both /usr/lib/node and /usr/lib/node_modules as suggested > > by Yann > > --- > > ...ules-cjs-loader.js-adjust-default-pa.patch | 36 +++++++++++++++++++ > > 1 file changed, 36 insertions(+) > > create mode 100644 package/nodejs/0004-lib-internal-modules-cjs-loader.js-adjust-default-pa.patch > > > > diff --git a/package/nodejs/0004-lib-internal-modules-cjs-loader.js-adjust-default-pa.patch b/package/nodejs/0004-lib-internal-modules-cjs-loader.js-adjust-default-pa.patch > > new file mode 100644 > > index 0000000000..5b93998e5e > > --- /dev/null > > +++ b/package/nodejs/0004-lib-internal-modules-cjs-loader.js-adjust-default-pa.patch > > @@ -0,0 +1,36 @@ > > +From a31425bdfcb5d695ab25c3d295898326784cffec Mon Sep 17 00:00:00 2001 > > +From: Thomas Petazzoni <thomas.petazzoni@bootlin.com> > > +Date: Sun, 25 Sep 2022 11:10:06 +0200 > > +Subject: [PATCH] lib/internal/modules/cjs/loader.js: adjust default path to > > + search modules > > + > > +NPM installs modules in /usr/lib/node_modules/, but by default NodeJS > > +searches for them only in /usr/lib/node/. We could also set the > > +NODE_PATH environment variable, but it is more convienient to have > > +NodeJS configured by default to find modules where they are installed. > > + > > +This issue is discussed at > > +https://stackoverflow.com/questions/15636367/nodejs-require-a-global-module-package. > > + > > +Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> > > +--- > > + lib/internal/modules/cjs/loader.js | 3 ++- > > + 1 file changed, 2 insertions(+), 1 deletion(-) > > + > > +diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js > > +index f1971c40a4..5fe3884156 100644 > > +--- a/lib/internal/modules/cjs/loader.js > > ++++ b/lib/internal/modules/cjs/loader.js > > +@@ -1261,7 +1261,8 @@ Module._initPaths = function() { > > + path.resolve(process.execPath, '..') : > > + path.resolve(process.execPath, '..', '..'); > > + > > +- const paths = [path.resolve(prefixDir, 'lib', 'node')]; > > ++ const paths = [path.resolve(prefixDir, 'lib', 'node'), > > ++ path.resolve(prefixDir, 'lib', 'node_modules')]; > > + > > + if (homeDir) { > > + ArrayPrototypeUnshift(paths, path.resolve(homeDir, '.node_libraries')); > > +-- > > +2.37.3 > > + > > _______________________________________________ > buildroot mailing list > buildroot@buildroot.org > https://lists.buildroot.org/mailman/listinfo/buildroot
diff --git a/package/nodejs/0004-lib-internal-modules-cjs-loader.js-adjust-default-pa.patch b/package/nodejs/0004-lib-internal-modules-cjs-loader.js-adjust-default-pa.patch new file mode 100644 index 0000000000..5b93998e5e --- /dev/null +++ b/package/nodejs/0004-lib-internal-modules-cjs-loader.js-adjust-default-pa.patch @@ -0,0 +1,36 @@ +From a31425bdfcb5d695ab25c3d295898326784cffec Mon Sep 17 00:00:00 2001 +From: Thomas Petazzoni <thomas.petazzoni@bootlin.com> +Date: Sun, 25 Sep 2022 11:10:06 +0200 +Subject: [PATCH] lib/internal/modules/cjs/loader.js: adjust default path to + search modules + +NPM installs modules in /usr/lib/node_modules/, but by default NodeJS +searches for them only in /usr/lib/node/. We could also set the +NODE_PATH environment variable, but it is more convienient to have +NodeJS configured by default to find modules where they are installed. + +This issue is discussed at +https://stackoverflow.com/questions/15636367/nodejs-require-a-global-module-package. + +Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> +--- + lib/internal/modules/cjs/loader.js | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js +index f1971c40a4..5fe3884156 100644 +--- a/lib/internal/modules/cjs/loader.js ++++ b/lib/internal/modules/cjs/loader.js +@@ -1261,7 +1261,8 @@ Module._initPaths = function() { + path.resolve(process.execPath, '..') : + path.resolve(process.execPath, '..', '..'); + +- const paths = [path.resolve(prefixDir, 'lib', 'node')]; ++ const paths = [path.resolve(prefixDir, 'lib', 'node'), ++ path.resolve(prefixDir, 'lib', 'node_modules')]; + + if (homeDir) { + ArrayPrototypeUnshift(paths, path.resolve(homeDir, '.node_libraries')); +-- +2.37.3 +
By default, NodeJS searches global modules in /usr/lib/node, but NPM installs them in /usr/lib/node_modules/. Therefore by default, if one installs modules with BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL, they are not accessible by NodeJS, unless by passing a NODE_PATH=/usr/lib/node_modules/ variable. Since this is not obvious, and it's nicer when things work out of the box, we simply patch NodeJS to look for modules at the right place. See https://stackoverflow.com/questions/15636367/nodejs-require-a-global-module-package for some discussions on this topic. Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> --- Changes since v1: - Search for both /usr/lib/node and /usr/lib/node_modules as suggested by Yann --- ...ules-cjs-loader.js-adjust-default-pa.patch | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 package/nodejs/0004-lib-internal-modules-cjs-loader.js-adjust-default-pa.patch