Browse Source

install: add a "portable" mode to the shebang-rewriting logic

This "portable" mode rewrites the npm shebang to use the "node" executable
in the same directory relative to the "npm" script. This makes the "npm"
script "just work" even when "node" is not in the user's $PATH.

This mode is necessary for the precompiled binary packages that may potentially
be extracted to anywhere. The regular shebang-rewriting logic would normally
set the npm script's shebang to "/bin/node" which will not be present on anyone's
machine. In the end, we want the precompiled packages to be as user-friendly as
possible.
v0.8.7-release
Nathan Rajlich 13 years ago
parent
commit
7a9db6cfb1
  1. 10
      tools/install.py

10
tools/install.py

@ -154,7 +154,15 @@ def npm_files(action):
action([link_path], 'bin/npm') action([link_path], 'bin/npm')
elif action == install: elif action == install:
try_symlink('../lib/node_modules/npm/bin/npm-cli.js', link_path) try_symlink('../lib/node_modules/npm/bin/npm-cli.js', link_path)
shebang = os.path.join(node_prefix, 'bin/node') if os.environ['PORTABLE']:
# This crazy hack is necessary to make the shebang execute the copy
# of node relative to the same directory as the npm script. The precompiled
# binary tarballs use a prefix of "/" which gets translated to "/bin/node"
# in the regular shebang modifying logic, which is incorrect since the
# precompiled bundle should be able to be extracted anywhere and "just work"
shebang = '/bin/sh\n// 2>/dev/null; exec "`dirname "$0"`/node" "$0" "$@"'
else:
shebang = os.path.join(node_prefix, 'bin/node')
update_shebang(link_path, shebang) update_shebang(link_path, shebang)
else: else:
assert(0) # unhandled action type assert(0) # unhandled action type

Loading…
Cancel
Save