pkg-js-tools7
Collection of tools to aid packaging node modules in debian.
Working with salsa.debian.org repository
To use salsa(1) with pkg-javascript configuration, add something like that in
your .bashrc:
alias js-salsa='salsa --conf-file +/usr/share/pkg-js-tools/pkg-js-salsa.conf'
Then you can use salsa simply. Some examples:
- •
-
if you created a local repo and want to create and push it on
salsa ⟨https://salsa.debian.org/js-team⟩, launch simply:
js-salsa push_repo .
- •
-
to configure a repo already pushed:
js-salsa update_safe node-foobar
- •
-
to clone locally a js-team package:
js-salsa co node-foobar
See salsa(1) for more.
Debhelper addon
pkg-js-tools debhelper addon is automatically loaded if a package
build-depends on dh-sequence-nodejs or (old fashion) if dh is called
with --with nodejs in debian/rules.
Quick use
Examples of basic migration to pkg-js-tools:
Switch test and install to pkg-js-tools ⟨https://salsa.debian.org/js-team/node-static-module/-/commit/2c6d9fb1⟩
How it works
pkg-js-tools provides hooks for these steps:
| Step | Comment |
| configure | populate node_modules/ |
| build | build components and main module |
| test | test components and main module |
| install | install components and main module |
| installdocs | can auto-generate docs for each component |
| clean | clean pkg-js-tools stuff |
Technically, it adds --buildsystem=nodejs to the corresponding dh_auto_<step>
command.
Important note. Here:
- •
-
componentis the directory name of a submodule (uscan(1) component or
additional components listed indebian/nodejs/additional_components).
Example:types-glob
- •
-
moduleis the npmjs name. Example:@types/glob
See Group Sources Tutorial ⟨https://wiki.debian.org/Javascript/GroupSourcesTutorial⟩
for more about embedding components.
Details:
- •
-
dh_auto_clean, cleans files automatically installed bypkg-js-tools
itself
- •
-
dh_auto_configure, automatically populatesnode_modulesdirectory:- •
-
links embedded components
- •
-
links global modules listed in
debian/nodejs/extlinks
- •
-
copies global modules listed in
debian/nodejs/extcopies
- •
-
dh_auto_build, Remember to add a dh_auto_build --buildsystem=nodejs
inoverride_dh_auto_buildsection if yourdebian/rulesfile has such
section, else this step will be ignored. Builds:- •
-
components by launching sh -ex debian/nodejs/<component-name>/build in
this file exists
- •
-
main module by launching sh -ex debian/nodejs/build if exists
- •
-
dh_auto_test, tests:- •
-
components by launching sh -ex debian/nodejs/<component-name>/test if
this file exists
- •
-
main module by launching sh -ex debian/tests/pkg-js/test if this file
exists. This test is also used by pkg-js-autopkgtest(7) during autopkgtest.
If you want to have a different test during build, set this test in
debian/nodejs/test.
- •
-
dh_auto_install: installs modules in the good directories and provides
some debhelper variables to be used indebian/control. Note that if your
package provides more that one binary package, you have to use some
debian/<package-name>.installfiles to distribute the files.
Steps:- •
-
components: determine files to install using the same algorithm than
main module
and install them:- •
-
nowhere if component if
debian/nodejs/submodulesexists and component
isn't listed in it (an emptydebian/nodejs/submodulesdrops all
components)
- •
-
nowhere if component is listed in
debian/nodejs/additional_components
with a "!" prefix
- •
-
in main nodejs directories if component is listed in
debian/nodejs/root_modules
- •
-
else: in a
node_modulessubdirectory of main module
- •
-
main module, determine files to install (see below) and install them
in the "good" directory:- •
-
if "architecture" is "all":
/usr/share/nodejs
- •
-
else:
/usr/lib/${DEB_HOST_MULTIARCH}/nodejs
- •
-
links: builds symlinks listed indebian/nodejs/links. Same usage
asdebian/linksexcept that source or destination not starting with/
are related to arch path
(/usr/share/nodejsor/usr/lib/<gnu-arch>/nodejs)
- •
-
Build pkgjs-lock.json files: if package "maybe a bundle"
(built with webpack, browserify,...), pkg-js-tools builds a
pkgjs-lock.jsonfor each module. This files may help in Debian
transitions
- •
-
Variables usable in
debian/control:- •
-
${nodejs:Version}: the version of nodejs used during build
- •
-
${nodejs:Provides}: virtual names to be added into "Provides:" field.
This lists all modules installed in nodejs root directories
- •
-
${nodeFoo:Provides}: for a source package that provides several binary
packages,dh-sequence-nodejsfilters${nodejs:Provides}for each
binary package. The package name is converted into its camelcase name:
node-jest-workerbecomes nodeJestWorker
- •
-
${nodejs:BuiltUsing}: when package "maybe a bundle", lists packages
and versions used to build package. Use it in
XB-Javascript-Built-Usingfield
- •
-
dh_installdocs: dh-sequence-nodejs provides a tool named
dh_nodejs_autodocswhich can be used in aoverride_dh_installdocs
to automatically generate documentation for each component. See related
manpage
- •
-
dh_install: dh-sequence-nodejs provides a tool named
dh_nodejs_build_debug_packagewhich can be used to build a separate
debug package with sourcemap files when package size is too big. See related
manpage
Automatically detect some additional components
Starting from 0.12.0, dh-sequence-nodejs automatically reads lerna.conf and
reads "packages" field to find additional components.
Starting from 0.12.7, it does the same when package.json has a "workspaces"
field.
This auto-detection automatically drops "test" and "tests" directories. You
can override this behavior using debian/additional_components.
If a component should not be considered, insert its name preceded by a "!" in
debian/nodejs/additional_components.
To disable this feature, use dh-sequence-nodejs-no-lerna.
Algorithm to determine files to install
pkg-js-tools tries to reproduce npm(1) behavior: it reads package.json
and/or .npmignore files to determine files to install except that it drops
licenses, *.md, doc*, example*, test*, makefiles,...`.
This behavior is overridden if:
- •
-
debian/nodejs/install(ordebian/nodejs/<component-name>/install)
exists. This file uses the same format thandebian/install.
- •
-
debian/nodejs/files(ordebian/nodejs/<component-name>/files) exists.
the content of this file replaces "files" entry ofpackage.json
pkg-js-tools files
- •
-
all steps:
- •
-
debian/nodejs/additional_componentsis used to set some
subdirectories that should be considered as components even if they
are not listed indebian/watch. Content example:packages/*.
Important note: in this example, component name ispackages/fooin
every other files, including paths
- •
-
debian/nodejs/mainis used to indicates where is the main module.
In a package containing only components (bundle package), you should
choose one of them as main component
- •
-
configure step:
- •
-
debian/build_modulesadditional modules needed to build, will be
linked innode_modulesdirectory
- •
-
debian/nodejs/component_linkslists needed links between components:
links../../component-srcincomponent-dst/node_modules/component-src-name
- •
-
debian/nodejs/<component-name>/nolinkavoidsnode_moduleslinks
creation for this component (configuration step)
- •
-
debian/nodejs/extlinkslists installed node modules that should be
linked intonode_modulesdirectory (modules are searched using nodejs
algorithm). You can mark them with "test" to avoid errors when build
profile containsnocheck
- •
-
debian/nodejs/extcopieslists installed node modules that should be
copied intonode_modulesdirectory. You can also mark them with "test"
- •
-
debian/nodejs/<component>/extlinkslists installed node modules that
should be linked in<component>/node_modulesdirectory (testflag available)
- •
-
debian/nodejs/<component>/extcopieslists installed node modules that
should be copied in<component>/node_modulesdirectory (testflag available)
- •
-
build step:
- •
-
debian/nodejs/buildcustom build. An empty file stops auto build
- •
-
debian/nodejs/<component>/build: same for components
- •
-
debian/nodejs/build_orderorders components build (one component
per line). Else components are built in alphabetic order except components
declared indebian/nodejs/component_links: a component that depends
on another is built after
- •
-
test step:
- •
-
debian/tests/test_modules/: additional modules needed for running tests can be
added to this directory as subdirectories, which will be linked innode_modules
directory during test step only
- •
-
debian/tests/pkg-js/test: script to launch during test
(launched with set -e)
- •
-
debian/tests/pkg-js/files: lists other files than
debian/tests/test\_modules/\*and installed files needed for autopkgtest
(default:test*)
- •
-
debian/nodejs/test: overwritedebian/tests/pkg-js/testduring
build if test differs in build and autopkgtest
- •
-
debian/nodejs/<component-name>/test: same for components
(launched during build only)
- •
-
autopkgtest files:
- •
-
debian/tests/autopkgtest-pkg-nodejs.conf: autodep8 configuration file
which can be used to add packages or restrictions during autopkgtest only- •
-
extra_depends=p1, p2, p3 permits one to add p1, p2 and p3 packages
- •
-
extra-restrictions=needs-internetpermits one to add additional restrictions
during autopkgtest
- •
-
debian/tests/pkg-js/require-name: contains the name to use in
autopkgtestrequiretest instead of package.json value
- •
-
install step:
- •
-
debian/nodejs/submoduleslists components to install (all if missing)
- •
-
debian/nodejs/root_moduleslists components to install in nodejs root
directory (instead ofnode_modulessubdirectory). If this file
contains *, all components are installed in root directory
- •
-
debian/nodejs/filesoverwritespackage.json#filesfield.
- •
-
debian/nodejs/<component-name>/filesoverwritespackage.json#files
field. An empty file avoid any install
- •
-
debian/nodejs/nameoverwritespackage.json#namefield.
- •
-
debian/nodejs/<component-name>/nameoverwritespackage.json#name
- •
-
debian/nodejs/installoverwritesdebian/nodejs/files: same usage as
debian/install except that destination not starting with/are related to
arch path (/usr/share/nodejsor/usr/lib/<gnu-arch>/nodejs)
- •
-
debian/nodejs/<component-name>/installsame asdebian/nodejs/install
for components
- •
-
link step:
- •
-
debian/nodejs/links: same usage as debian/links except that source or
destination not starting with/are related to arch path
(/usr/share/nodejsor/usr/lib/<gnu-arch>/nodejs)
NB: To install a component in another directory, set its files in debian/install.
Example:
- •
-
debian/control
... Testsuite: autopkgtest-pkg-nodejs Build-Depends: dh-sequence-nodejs ...
- •
-
debian/tests/pkg-js/test
mocha -R spec
See also pkg-js-autopkgtest README ⟨../autopkgtest/README.md⟩.
Multiple binary packages
When debian/control provides more than one binary package, dh_auto_install
populates a debian/tmp and dh_install install files in each package. In
this case, you must write a debian/<package>.install for each binary
package. Each line with only one argument is related to debian/tmp.
Examples:
- •
-
debian/node-arch-indep.install: pick files from
debian/tmp
usr/share/nodejs/foo/
- •
-
debian/node-arch-dep.install: pick files from
debian/tmp
usr/lib/*/nodejs/foo/
- •
-
debian/libjs.install: pick files from sources
dist/* usr/share/javascript/foo/
Links
Since path is not fixed for arch-dependent package, you must write
debian/nodejs/links:
# debian/nodejs/links foo/bin/cli.js /usr/bin/foo
With a arch independent package, pkg-js-tools transforms this into:
/usr/share/nodejs/foo/bin/cli.js /usr/bin/foo
and for a arch dependent package, it uses DEB_GNU_ARCH. Example with amd64:
/usr/lib/x86_64-linux-gnu/foo/bin/cli.js /usr/bin/foo
All fields that does not start with / are prefixed with the good nodejs path
Component docs
Starting from version 0.13.0, pkg-js-tools provides dh_nodejs_autodocs.
This tool automatically install README.md, CONTRIBUTING.md,... for each
root component in its /usr/share/doc/node-<name> directory. And if no
debian/*docs is found, it does the same for the main component. To use it:
override_dh_installdocs: dh_installdocs dh_nodejs_autodocs
.eslint* files
pkg-js-tools auto installer always removes .eslint* files unless it
is explicitly specified in debian/nodejs/**/files or
debian/nodejs/**/install.
Having different test between build and autopkgtest
When debian/nodejs/test exists, this file is used during build test instead
of debian/tests/pkg-js/test. This permits one to have a different test. You can
also overwrite dh_auto_test step in debian/rules:
override_dh_auto_test:
# No test during build (test needs Internet)
Autopkgtest additional test packages or test restrictions
autodep8 allows one to add additional packages during autopkgtest (and/or
additional restrictions) by using a debian/tests/autopkgtest-pkg-nodejs.conf
file:
extra_depends=mocha, npm extra-restrictions=needs-internet
Lintian profiles
pkg-js-tools provides a lintian profile:
- •
-
pkg-js-extra: launches additional checks (repo consistency see
debcheck-node-repo below)
To use them:
lintian --profile pkg-js-extra ../node-foo_1.2.3-1.changes
Other tools
See related manpages.
- •
-
add-node-component: automatically modifies gbp.conf and debian/watch to add
a node component. See
JS Group Sources Tutorial ⟨https://wiki.debian.org/Javascript/GroupSourcesTutorial⟩.It can also list components or modules (real names)
- •
-
getFromNpmCache: export npm cache content to standard output
- •
-
github-debian-upstream: launches it in source repo to create a
debian/upstream/metadata (works only if upstream repo is on GitHub)
- •
-
nodepath: shows the path of a node module (npm name). You can use-pto
show also the Debian package. Option-oshows only Debian package name.
- •
-
debcheck-node-repo: checks repo consistency: compares vcs repo registered
in npm registry with the source repo declared in debian/watch"
- •
-
dh_nodejs_autodocs: automatically select and install documentation files
toinstall for each component
- •
-
dh_nodejs_build_debug_package: move sourcemap files from binary
packages to a separated debug package
- •
-
mjs2cjs: build commonjs file using rollup
- •
-
pkgjs-audit: creates a temporarypackage-lock.jsonfile using Debian
package values used by the module to analyze, and launch a npm audit. If
module is a bundle (and then has apkgjs-lock.json), pkgjs-audit uses
pkgjs-lock.json, else it generates its package-lock.json using available
values
- •
-
pkgjs-depends: search recursively dependencies of the given module name
(if not given, use current package.json) and displays related Debian packages
and missing dependencies
- •
-
pkgjs-install: same as npm install but uses Debian JS modules when
available
- •
-
pkgjs-install-minimal: same as pkgjs-install but uses only available
Debian modules. It is included in dh-nodejs so can be used during build
- •
-
pkgjs-ls: same as npm ls but it search also in global nodejs paths
- •
-
pkgjs-run: same as npm run
- •
-
pkgjs-lerna run: same as lerna run (only run command is implemented)
- •
-
pkgjs-utils,pkgjs-ln,pkgjs-main,pkgjs-pjson: various
utilities. Seepkgjs-utils(1)manpage
- •
-
pkgjs: try to reproduceyarnpkg(1)commands withpkgjs-*scripts.
Features history
| TOOL | Minimal version |
| add-node-component | 0.8.14 |
| add-node-component --cmp-tree | 0.9.22 |
| debcheck-node-repo | 0.8.14 |
| dh_nodejs_autodocs | 0.13.0 |
| dh_nodejs_autodocs auto_dispatch | 0.14.5 |
| dh_nodejs_build_debug_package | 0.15.5 |
| dh_nodejs_substvars | 0.14.5 |
| dh-make-node | 0.9.18 |
| getFromNpmCache | 0.14.32 |
| mjs2cjs | 0.12.3 |
| mjs2cjs -a | 0.14.14 |
| pkgjs | 0.15.21 |
| pkgjs-audit | 0.11.2 |
| pkgjs-depends | 0.9.54 |
| pkgjs-depends --graph | 0.14.34 |
| pkgjs-install | 0.14.20 |
| pkgjs-install-minimal | 0.14.27 |
| pkgjs-ln | 0.9.76 |
| pkgjs-lerna | 0.15.13 |
| pkgjs-ls | 0.9.30 |
| pkgjs-main | 0.9.76 |
| pkgjs-pjson | 0.9.76 |
| pkgjs-run | 0.14.22 |
| pkgjs-utils | 0.9.75 |
| FEATURE | Minimal version |
| additional_components | 0.9.11 |
| auto build (grunt) | 0.9.3 |
| autopkgtest skip | 0.9.30 |
| auto-install (arch-dep) | 0.9.27 |
| build order | 0.9.10 |
| dh-sequence-nodejs | 0.9.41 |
| follow lerna.json#useWorkspaces | 0.14.8 |
| .npmignore support | 0.9.53 |
| support lerna.conf | 0.12.0 |
| support workspaces | 0.12.7 |
| debian/nodejs/main | 0.9.11 |
| debian/tests/test_modules | 0.9.33 |
| debian/build_modules | 0.9.33 |
| ${nodejs:BuiltUsing} | 0.11.8 |
| ${nodejs:Provides} | 0.9.10 |
| ${nodejs:Version} | 0.9.38 |
| ${nodeFoo:Provides} | 0.14.5 |
| ordered_components_list | 0.15.13 |
| packages_list | 0.15.13 |
Copyright and license
Copyright Yadd <[email protected]>
This library is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
On Debian systems, the complete text of version 2 of the GNU General
Public License can be found in `/usr/share/common-licenses/GPL-2'.
If not, see GNU licenses ⟨http://www.gnu.org/licenses/⟩;
Releases
2 releases since Debian 12 (Bookworm); the text changed 1 time.