Adam Majer
38fc9b6db2
since previous versions, see https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V18.md#18.2.0 OBS-URL: https://build.opensuse.org/package/show/devel:languages:nodejs/nodejs18?expand=0&rev=1
519 lines
17 KiB
Diff
519 lines
17 KiB
Diff
Author: Adam Majer <amajer@suse.de>
|
|
Date: Fri May 11 16:10:16 CEST 2018
|
|
Summary: Generate versioned binaries
|
|
|
|
Generate versioned binaries and install paths
|
|
so we can allow concurrent installations and
|
|
management via update_alternatives.
|
|
|
|
This is also important for generation of binary
|
|
modules for multiple versions of NodeJS
|
|
Index: node-v18.2.0/Makefile
|
|
===================================================================
|
|
--- node-v18.2.0.orig/Makefile
|
|
+++ node-v18.2.0/Makefile
|
|
@@ -55,7 +55,7 @@ BUILDTYPE_LOWER := $(shell echo $(BUILDT
|
|
EXEEXT := $(shell $(PYTHON) -c \
|
|
"import sys; print('.exe' if sys.platform == 'win32' else '')")
|
|
|
|
-NODE_EXE = node$(EXEEXT)
|
|
+NODE_EXE = node18$(EXEEXT)
|
|
NODE ?= ./$(NODE_EXE)
|
|
NODE_G_EXE = node_g$(EXEEXT)
|
|
NPM ?= ./deps/npm/bin/npm-cli.js
|
|
Index: node-v18.2.0/tools/install.py
|
|
===================================================================
|
|
--- node-v18.2.0.orig/tools/install.py
|
|
+++ node-v18.2.0/tools/install.py
|
|
@@ -86,7 +86,7 @@ def uninstall(paths, dst):
|
|
try_remove(path, dst)
|
|
|
|
def package_files(action, name, bins):
|
|
- target_path = libdir() + '/node_modules/' + name + '/'
|
|
+ target_path = libdir() + '/node_modules/' + name + '18/'
|
|
|
|
# don't install npm if the target path is a symlink, it probably means
|
|
# that a dev version of npm is installed there
|
|
@@ -106,19 +106,19 @@ def package_files(action, name, bins):
|
|
if action == uninstall:
|
|
action([link_path], 'bin/' + bin_name)
|
|
elif action == install:
|
|
- try_symlink('../' + libdir() + '/node_modules/' + name + '/' + bin_target, link_path)
|
|
+ try_symlink('../' + libdir() + '/node_modules/' + name + '18/' + bin_target, link_path)
|
|
else:
|
|
assert 0 # unhandled action type
|
|
|
|
def npm_files(action):
|
|
package_files(action, 'npm', {
|
|
- 'npm': 'bin/npm-cli.js',
|
|
- 'npx': 'bin/npx-cli.js',
|
|
+ 'npm18': 'bin/npm-cli.js',
|
|
+ 'npx18': 'bin/npx-cli.js',
|
|
})
|
|
|
|
def corepack_files(action):
|
|
package_files(action, 'corepack', {
|
|
- 'corepack': 'dist/corepack.js',
|
|
+ 'corepack18': 'dist/corepack.js',
|
|
# Not the default just yet:
|
|
# 'yarn': 'dist/yarn.js',
|
|
# 'yarnpkg': 'dist/yarn.js',
|
|
@@ -136,7 +136,7 @@ def subdir_files(path, dest, action):
|
|
|
|
def files(action):
|
|
is_windows = sys.platform == 'win32'
|
|
- output_file = 'node'
|
|
+ output_file = 'node18'
|
|
output_prefix = 'out/Release/'
|
|
|
|
if is_windows:
|
|
@@ -154,7 +154,7 @@ def files(action):
|
|
action(['out/Release/node.d'], libdir() + '/dtrace/node.d')
|
|
|
|
# behave similarly for systemtap
|
|
- action(['src/node.stp'], 'share/systemtap/tapset/')
|
|
+ action(['src/node.stp'], 'share/systemtap/tapset/node18.stp')
|
|
|
|
action(['deps/v8/tools/gdbinit'], 'share/doc/node/')
|
|
action(['deps/v8/tools/lldb_commands.py'], 'share/doc/node/')
|
|
@@ -162,7 +162,7 @@ def files(action):
|
|
if 'freebsd' in sys.platform or 'openbsd' in sys.platform:
|
|
action(['doc/node.1'], 'man/man1/')
|
|
else:
|
|
- action(['doc/node.1'], 'share/man/man1/')
|
|
+ action(['doc/node.1'], 'share/man/man1/node18.1')
|
|
|
|
if 'true' == variables.get('node_install_npm'):
|
|
npm_files(action)
|
|
@@ -249,28 +249,28 @@ def headers(action):
|
|
'src/node_buffer.h',
|
|
'src/node_object_wrap.h',
|
|
'src/node_version.h',
|
|
- ], 'include/node/')
|
|
+ ], 'include/node18/')
|
|
|
|
# Add the expfile that is created on AIX
|
|
if sys.platform.startswith('aix'):
|
|
- action(['out/Release/node.exp'], 'include/node/')
|
|
+ action(['out/Release/node.exp'], 'include/node18/')
|
|
|
|
- subdir_files('deps/v8/include', 'include/node/', wanted_v8_headers)
|
|
+ subdir_files('deps/v8/include', 'include/node18/', wanted_v8_headers)
|
|
|
|
if 'false' == variables.get('node_shared_libuv'):
|
|
- subdir_files('deps/uv/include', 'include/node/', action)
|
|
+ subdir_files('deps/uv/include', 'include/node18/', action)
|
|
|
|
if 'true' == variables.get('node_use_openssl') and \
|
|
'false' == variables.get('node_shared_openssl'):
|
|
- subdir_files('deps/openssl/openssl/include/openssl', 'include/node/openssl/', action)
|
|
- subdir_files('deps/openssl/config/archs', 'include/node/openssl/archs', action)
|
|
- subdir_files('deps/openssl/config', 'include/node/openssl', action)
|
|
+ subdir_files('deps/openssl/openssl/include/openssl', 'include/node18/openssl/', action)
|
|
+ subdir_files('deps/openssl/config/archs', 'include/node18/openssl/archs', action)
|
|
+ subdir_files('deps/openssl/config', 'include/node18/openssl', action)
|
|
|
|
if 'false' == variables.get('node_shared_zlib'):
|
|
action([
|
|
'deps/zlib/zconf.h',
|
|
'deps/zlib/zlib.h',
|
|
- ], 'include/node/')
|
|
+ ], 'include/node18/')
|
|
|
|
if sys.platform == 'zos':
|
|
zoslibinc = os.environ.get('ZOSLIB_INCLUDES')
|
|
Index: node-v18.2.0/doc/node.1
|
|
===================================================================
|
|
--- node-v18.2.0.orig/doc/node.1
|
|
+++ node-v18.2.0/doc/node.1
|
|
@@ -30,24 +30,24 @@
|
|
.Dt NODE 1
|
|
.
|
|
.Sh NAME
|
|
-.Nm node
|
|
+.Nm node18
|
|
.Nd server-side JavaScript runtime
|
|
.
|
|
.\"======================================================================
|
|
.Sh SYNOPSIS
|
|
-.Nm node
|
|
+.Nm node18
|
|
.Op Ar options
|
|
.Op Ar v8-options
|
|
.Op Fl e Ar string | Ar script.js | Fl
|
|
.Op Fl -
|
|
.Op Ar arguments ...
|
|
.
|
|
-.Nm node
|
|
+.Nm node18
|
|
.Cm inspect
|
|
.Op Fl e Ar string | Ar script.js | Fl | Ar <host>:<port>
|
|
.Ar ...
|
|
.
|
|
-.Nm node
|
|
+.Nm node18
|
|
.Op Fl -v8-options
|
|
.
|
|
.\"======================================================================
|
|
Index: node-v18.2.0/src/node.stp
|
|
===================================================================
|
|
--- node-v18.2.0.orig/src/node.stp
|
|
+++ node-v18.2.0/src/node.stp
|
|
@@ -19,7 +19,7 @@
|
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
-probe node_net_server_connection = process("node").mark("net__server__connection")
|
|
+probe node_net_server_connection = process("node18").mark("net__server__connection")
|
|
{
|
|
remote = user_string($arg2);
|
|
port = $arg3;
|
|
@@ -32,7 +32,7 @@ probe node_net_server_connection = proce
|
|
fd);
|
|
}
|
|
|
|
-probe node_net_stream_end = process("node").mark("net__stream__end")
|
|
+probe node_net_stream_end = process("node18").mark("net__stream__end")
|
|
{
|
|
remote = user_string($arg2);
|
|
port = $arg3;
|
|
@@ -45,7 +45,7 @@ probe node_net_stream_end = process("nod
|
|
fd);
|
|
}
|
|
|
|
-probe node_http_server_request = process("node").mark("http__server__request")
|
|
+probe node_http_server_request = process("node18").mark("http__server__request")
|
|
{
|
|
remote = user_string($arg3);
|
|
port = $arg4;
|
|
@@ -62,7 +62,7 @@ probe node_http_server_request = process
|
|
fd);
|
|
}
|
|
|
|
-probe node_http_server_response = process("node").mark("http__server__response")
|
|
+probe node_http_server_response = process("node18").mark("http__server__response")
|
|
{
|
|
remote = user_string($arg2);
|
|
port = $arg3;
|
|
@@ -75,7 +75,7 @@ probe node_http_server_response = proces
|
|
fd);
|
|
}
|
|
|
|
-probe node_http_client_request = process("node").mark("http__client__request")
|
|
+probe node_http_client_request = process("node18").mark("http__client__request")
|
|
{
|
|
remote = user_string($arg3);
|
|
port = $arg4;
|
|
@@ -92,7 +92,7 @@ probe node_http_client_request = process
|
|
fd);
|
|
}
|
|
|
|
-probe node_http_client_response = process("node").mark("http__client__response")
|
|
+probe node_http_client_response = process("node18").mark("http__client__response")
|
|
{
|
|
remote = user_string($arg2);
|
|
port = $arg3;
|
|
@@ -105,7 +105,7 @@ probe node_http_client_response = proces
|
|
fd);
|
|
}
|
|
|
|
-probe node_gc_start = process("node").mark("gc__start")
|
|
+probe node_gc_start = process("node18").mark("gc__start")
|
|
{
|
|
scavenge = 1 << 0;
|
|
compact = 1 << 1;
|
|
@@ -125,7 +125,7 @@ probe node_gc_start = process("node").ma
|
|
flags);
|
|
}
|
|
|
|
-probe node_gc_stop = process("node").mark("gc__done")
|
|
+probe node_gc_stop = process("node18").mark("gc__done")
|
|
{
|
|
scavenge = 1 << 0;
|
|
compact = 1 << 1;
|
|
Index: node-v18.2.0/deps/npm/man/man1/npm.1
|
|
===================================================================
|
|
--- node-v18.2.0.orig/deps/npm/man/man1/npm.1
|
|
+++ node-v18.2.0/deps/npm/man/man1/npm.1
|
|
@@ -1,6 +1,6 @@
|
|
.TH "NPM" "1" "May 2022" "" ""
|
|
.SH "NAME"
|
|
-\fBnpm\fR \- javascript package manager
|
|
+\fBnpm18\fR \- javascript package manager
|
|
.SS Synopsis
|
|
.SS Version
|
|
.P
|
|
@@ -15,7 +15,7 @@ It is extremely configurable to support
|
|
commonly, you use it to publish, discover, install, and develop node
|
|
programs\.
|
|
.P
|
|
-Run \fBnpm help\fP to get a list of available commands\.
|
|
+Run \fBnpm18 help\fP to get a list of available commands\.
|
|
.SS Important
|
|
.P
|
|
npm comes preconfigured to use npm's public registry at
|
|
@@ -31,14 +31,14 @@ their terms of use\.
|
|
You probably got npm because you want to install stuff\.
|
|
.P
|
|
The very first thing you will most likely want to run in any node
|
|
-program is \fBnpm install\fP to install its dependencies\.
|
|
+program is \fBnpm18 install\fP to install its dependencies\.
|
|
.P
|
|
-You can also run \fBnpm install blerg\fP to install the latest version of
|
|
+You can also run \fBnpm18 install blerg\fP to install the latest version of
|
|
"blerg"\. Check out npm help \fBinstall\fP for more
|
|
info\. It can do a lot of stuff\.
|
|
.P
|
|
-Use the \fBnpm search\fP command to show everything that's available in the
|
|
-public registry\. Use \fBnpm ls\fP to show everything you've installed\.
|
|
+Use the \fBnpm18 search\fP command to show everything that's available in the
|
|
+public registry\. Use \fBnpm18 ls\fP to show everything you've installed\.
|
|
.SS Dependencies
|
|
.P
|
|
If a package lists a dependency using a git URL, npm will install that
|
|
@@ -87,7 +87,7 @@ npm help \fBpackage\.json\fP\|\.
|
|
.IP \(bu 2
|
|
link:
|
|
Links your current working code into Node's path, so that you don't
|
|
-have to reinstall every time you make a change\. Use npm help \fBnpm
|
|
+have to reinstall every time you make a change\. Use npm help \fBnpm18
|
|
link\fP to do this\.
|
|
.IP \(bu 2
|
|
install:
|
|
@@ -170,18 +170,18 @@ https://github\.com/npm/rfcs
|
|
.SS See Also
|
|
.RS 0
|
|
.IP \(bu 2
|
|
-npm help help
|
|
+npm18 help help
|
|
.IP \(bu 2
|
|
-npm help package\.json
|
|
+npm18 help package\.json
|
|
.IP \(bu 2
|
|
-npm help npmrc
|
|
+npm18 help npmrc
|
|
.IP \(bu 2
|
|
-npm help config
|
|
+npm18 help config
|
|
.IP \(bu 2
|
|
-npm help install
|
|
+npm18 help install
|
|
.IP \(bu 2
|
|
-npm help prefix
|
|
+npm18 help prefix
|
|
.IP \(bu 2
|
|
-npm help publish
|
|
+npm18 help publish
|
|
|
|
.RE
|
|
Index: node-v18.2.0/src/node_main.cc
|
|
===================================================================
|
|
--- node-v18.2.0.orig/src/node_main.cc
|
|
+++ node-v18.2.0/src/node_main.cc
|
|
@@ -122,6 +122,7 @@ int main(int argc, char* argv[]) {
|
|
#endif
|
|
// Disable stdio buffering, it interacts poorly with printf()
|
|
// calls elsewhere in the program (e.g., any logging from V8.)
|
|
+ setenv("NODE_VERSION", "18", 0);
|
|
setvbuf(stdout, nullptr, _IONBF, 0);
|
|
setvbuf(stderr, nullptr, _IONBF, 0);
|
|
return node::Start(argc, argv);
|
|
Index: node-v18.2.0/tools/test.py
|
|
===================================================================
|
|
--- node-v18.2.0.orig/tools/test.py
|
|
+++ node-v18.2.0/tools/test.py
|
|
@@ -935,7 +935,7 @@ class Context(object):
|
|
if self.vm is not None:
|
|
return self.vm
|
|
if arch == 'none':
|
|
- name = 'out/Debug/node' if mode == 'debug' else 'out/Release/node'
|
|
+ name = 'out/Debug/node' if mode == 'debug' else 'out/Release/node18'
|
|
else:
|
|
name = 'out/%s.%s/node' % (arch, mode)
|
|
|
|
Index: node-v18.2.0/node.gyp
|
|
===================================================================
|
|
--- node-v18.2.0.orig/node.gyp
|
|
+++ node-v18.2.0/node.gyp
|
|
@@ -24,8 +24,8 @@
|
|
'node_use_openssl%': 'true',
|
|
'node_shared_openssl%': 'false',
|
|
'node_v8_options%': '',
|
|
- 'node_core_target_name%': 'node',
|
|
- 'node_lib_target_name%': 'libnode',
|
|
+ 'node_core_target_name%': 'node18',
|
|
+ 'node_lib_target_name%': 'libnode18',
|
|
'node_intermediate_lib_type%': 'static_library',
|
|
'node_builtin_modules_path%': '',
|
|
# We list the deps/ files out instead of globbing them in js2c.py since we
|
|
Index: node-v18.2.0/deps/npm/man/man1/npx.1
|
|
===================================================================
|
|
--- node-v18.2.0.orig/deps/npm/man/man1/npx.1
|
|
+++ node-v18.2.0/deps/npm/man/man1/npx.1
|
|
@@ -5,10 +5,10 @@
|
|
.P
|
|
.RS 2
|
|
.nf
|
|
-npx \-\- <pkg>[@<version>] [args\.\.\.]
|
|
-npx \-\-package=<pkg>[@<version>] \-\- <cmd> [args\.\.\.]
|
|
-npx \-c '<cmd> [args\.\.\.]'
|
|
-npx \-\-package=foo \-c '<cmd> [args\.\.\.]'
|
|
+npx18 \-\- <pkg>[@<version>] [args\.\.\.]
|
|
+npx18 \-\-package=<pkg>[@<version>] \-\- <cmd> [args\.\.\.]
|
|
+npx18 \-c '<cmd> [args\.\.\.]'
|
|
+npx18 \-\-package=foo \-c '<cmd> [args\.\.\.]'
|
|
.fi
|
|
.RE
|
|
.SS Description
|
|
@@ -57,9 +57,9 @@ no bin entries, or none of them match th
|
|
To run a binary \fIother than\fR the named binary, specify one or more
|
|
\fB\-\-package\fP options, which will prevent npm from inferring the package from
|
|
the first command argument\.
|
|
-.SS \fBnpx\fP vs \fBnpm exec\fP
|
|
+.SS \fBnpx18\fP vs \fBnpm exec\fP
|
|
.P
|
|
-When run via the \fBnpx\fP binary, all flags and options \fImust\fR be set prior to
|
|
+When run via the \fBnpx18\fP binary, all flags and options \fImust\fR be set prior to
|
|
any positional arguments\. When run via \fBnpm exec\fP, a double\-hyphen \fB\-\-\fP
|
|
flag can be used to suppress npm's parsing of switches and options that
|
|
should be sent to the executed command\.
|
|
@@ -68,7 +68,7 @@ For example:
|
|
.P
|
|
.RS 2
|
|
.nf
|
|
-$ npx foo@latest bar \-\-package=@npmcli/foo
|
|
+$ npx18 foo@latest bar \-\-package=@npmcli/foo
|
|
.fi
|
|
.RE
|
|
.P
|
|
@@ -89,7 +89,7 @@ different:
|
|
.P
|
|
.RS 2
|
|
.nf
|
|
-$ npm exec foo@latest bar \-\-package=@npmcli/foo
|
|
+$ npm18 exec foo@latest bar \-\-package=@npmcli/foo
|
|
.fi
|
|
.RE
|
|
.P
|
|
@@ -105,11 +105,11 @@ $ foo@latest bar
|
|
.P
|
|
The double\-hyphen character is recommended to explicitly tell npm to stop
|
|
parsing command line options and switches\. The following command would
|
|
-thus be equivalent to the \fBnpx\fP command above:
|
|
+thus be equivalent to the \fBnpx18\fP command above:
|
|
.P
|
|
.RS 2
|
|
.nf
|
|
-$ npm exec \-\- foo@latest bar \-\-package=@npmcli/foo
|
|
+$ npm18 exec \-\- foo@latest bar \-\-package=@npmcli/foo
|
|
.fi
|
|
.RE
|
|
.SS Examples
|
|
@@ -119,8 +119,8 @@ arguments:
|
|
.P
|
|
.RS 2
|
|
.nf
|
|
-$ npm exec \-\- tap \-\-bail test/foo\.js
|
|
-$ npx tap \-\-bail test/foo\.js
|
|
+$ npm18 exec \-\- tap \-\-bail test/foo\.js
|
|
+$ npx18 tap \-\-bail test/foo\.js
|
|
.fi
|
|
.RE
|
|
.P
|
|
@@ -129,9 +129,9 @@ by specifying a \fB\-\-package\fP option
|
|
.P
|
|
.RS 2
|
|
.nf
|
|
-$ npm exec \-\-package=foo \-\- bar \-\-bar\-argument
|
|
+$ npm18 exec \-\-package=foo \-\- bar \-\-bar\-argument
|
|
# ~ or ~
|
|
-$ npx \-\-package=foo bar \-\-bar\-argument
|
|
+$ npx18 \-\-package=foo bar \-\-bar\-argument
|
|
.fi
|
|
.RE
|
|
.P
|
|
@@ -139,14 +139,14 @@ Run an arbitrary shell script, in the co
|
|
.P
|
|
.RS 2
|
|
.nf
|
|
-$ npm x \-c 'eslint && say "hooray, lint passed"'
|
|
-$ npx \-c 'eslint && say "hooray, lint passed"'
|
|
+$ npm18 x \-c 'eslint && say "hooray, lint passed"'
|
|
+$ npx18 \-c 'eslint && say "hooray, lint passed"'
|
|
.fi
|
|
.RE
|
|
.SS Compatibility with Older npx Versions
|
|
.P
|
|
-The \fBnpx\fP binary was rewritten in npm v7\.0\.0, and the standalone \fBnpx\fP
|
|
-package deprecated at that time\. \fBnpx\fP uses the \fBnpm exec\fP
|
|
+The \fBnpx18\fP binary was rewritten in npm v7\.0\.0, and the standalone \fBnpx18\fP
|
|
+package deprecated at that time\. \fBnpx18\fP uses the \fBnpm18 exec\fP
|
|
command instead of a separate argument parser and install process, with
|
|
some affordances to maintain backwards compatibility with the arguments it
|
|
accepted in previous versions\.
|
|
@@ -154,10 +154,10 @@ accepted in previous versions\.
|
|
This resulted in some shifts in its functionality:
|
|
.RS 0
|
|
.IP \(bu 2
|
|
-Any \fBnpm\fP config value may be provided\.
|
|
+Any \fBnpm18\fP config value may be provided\.
|
|
.IP \(bu 2
|
|
To prevent security and user\-experience problems from mistyping package
|
|
-names, \fBnpx\fP prompts before installing anything\. Suppress this
|
|
+names, \fBnpx18\fP prompts before installing anything\. Suppress this
|
|
prompt with the \fB\-y\fP or \fB\-\-yes\fP option\.
|
|
.IP \(bu 2
|
|
The \fB\-\-no\-install\fP option is deprecated, and will be converted to \fB\-\-no\fP\|\.
|
|
@@ -165,13 +165,13 @@ The \fB\-\-no\-install\fP option is depr
|
|
Shell fallback functionality is removed, as it is not advisable\.
|
|
.IP \(bu 2
|
|
The \fB\-p\fP argument is a shorthand for \fB\-\-parseable\fP in npm, but shorthand
|
|
-for \fB\-\-package\fP in npx\. This is maintained, but only for the \fBnpx\fP
|
|
+for \fB\-\-package\fP in npx\. This is maintained, but only for the \fBnpx18\fP
|
|
executable\.
|
|
.IP \(bu 2
|
|
The \fB\-\-ignore\-existing\fP option is removed\. Locally installed bins are
|
|
always present in the executed process \fBPATH\fP\|\.
|
|
.IP \(bu 2
|
|
-The \fB\-\-npm\fP option is removed\. \fBnpx\fP will always use the \fBnpm\fP it ships
|
|
+The \fB\-\-npm18\fP option is removed\. \fBnpx18\fP will always use the \fBnpm18\fP it ships
|
|
with\.
|
|
.IP \(bu 2
|
|
The \fB\-\-node\-arg\fP and \fB\-n\fP options are removed\.
|
|
@@ -179,26 +179,26 @@ The \fB\-\-node\-arg\fP and \fB\-n\fP op
|
|
The \fB\-\-always\-spawn\fP option is redundant, and thus removed\.
|
|
.IP \(bu 2
|
|
The \fB\-\-shell\fP option is replaced with \fB\-\-script\-shell\fP, but maintained
|
|
-in the \fBnpx\fP executable for backwards compatibility\.
|
|
+in the \fBnpx18\fP executable for backwards compatibility\.
|
|
|
|
.RE
|
|
.SS See Also
|
|
.RS 0
|
|
.IP \(bu 2
|
|
-npm help run\-script
|
|
+npm18 help run\-script
|
|
.IP \(bu 2
|
|
-npm help scripts
|
|
+npm18 help scripts
|
|
.IP \(bu 2
|
|
-npm help test
|
|
+npm18 help test
|
|
.IP \(bu 2
|
|
-npm help start
|
|
+npm18 help start
|
|
.IP \(bu 2
|
|
-npm help restart
|
|
+npm18 help restart
|
|
.IP \(bu 2
|
|
-npm help stop
|
|
+npm18 help stop
|
|
.IP \(bu 2
|
|
-npm help config
|
|
+npm18 help config
|
|
.IP \(bu 2
|
|
-npm help exec
|
|
+npm18 help exec
|
|
|
|
.RE
|