有谁知道如何实现从命令行执行节点 bash proram,例如您可能调用“brew install”的方式 - 通常,您需要调用“node NAME_OF_CLI ”。
问题是我不能只将我的程序放入 /bin 文件夹,因为我还需要将 node_modules 文件夹放在那里——这似乎是不可接受的。有没有一种已知的方法可以将所有这些东西打包在一起,使它成为一个可执行程序?
另外,我不希望它出现在 npm 中——这不是公共模块。
有谁知道如何实现从命令行执行节点 bash proram,例如您可能调用“brew install”的方式 - 通常,您需要调用“node NAME_OF_CLI ”。
问题是我不能只将我的程序放入 /bin 文件夹,因为我还需要将 node_modules 文件夹放在那里——这似乎是不可接受的。有没有一种已知的方法可以将所有这些东西打包在一起,使它成为一个可执行程序?
另外,我不希望它出现在 npm 中——这不是公共模块。
这就是我要做的。
#!/bin/sh
DIR=$(dirname "${0}")
exec "${DIR}/node/bin/node" "${DIR}/main.js" "${@}"
我在评论中注意到您想要一个自制风格的 install-via curl 命令行。在这种情况下,以上所有内容仍然适用,但您的 curl 命令会下载一个执行以下操作的 shell 脚本:
/usr/local/programname
将是合理的)bin
用户 PATH 中的目录中(/usr/local/bin/programname
这是合理的)所以你的 curl 命令可能是curl http://example.com/myprogram/install.sh | sh
同样,这与12 Factor App原则是一致的,这些原则是合理的。尤其是:
chmod
为install.sh
zip 存档,并且 tar 在某些情况下不会保留它tar
. 改为使用gnutar
。参考自制的go
ruby 程序的想法/灵感https://raw.github.com/mxcl/homebrew/go
以下是从我的网站的 github 存储库中的构建脚本中获取的一些示例
install_node() {
local VERSION=${1-0.10.7}
local PREFIX=${2-node}
local PLATFORM=$(uname | tr A-Z a-z)
case $(uname -p) in
i686)
ARCH=x86
;;
esac
mkdir -p "${PREFIX}"
curl --silent \
"http://nodejs.org/dist/v${VERSION}/node-v${VERSION}-${PLATFORM}-${ARCH}.tar.gz" \
| tar xzf - --strip-components=1 -C "${PREFIX}"
}
task:dist() {
cd "${CODE_PATH}"
local GIT_REF="${1-master}"
local BUILD_DIR="build"
local DIST_DIR="dist"
local PREFIX="${SITE}-${GIT_REF}"
dirs "${BUILD_DIR}" "${DIST_DIR}"
echo doing git archive
git archive --format=tar --prefix="${PREFIX}/" "${GIT_REF}" | \
#extract that archive into a temporary build directory
"${TAR}" --directory "${BUILD_DIR}" --extract
#install node
NODE_VERSION=$(./bin/jsonpath.coffee engines.node)
echo installing node
install_node "${NODE_VERSION}" "${BUILD_DIR}/${PREFIX}/node"
#Note we use npm from the build platform (OS X) here instead of
#the one for the run platform as they are incompatible
echo install npm packages
(cd "${BUILD_DIR}/${PREFIX}" && npm install --silent --production)
echo creating archive
"${TAR}" --directory "${BUILD_DIR}" --create --bzip2 --file "${DIST_DIR}/${PREFIX}.tar.bz2" .
}
将文件添加到 ./bin 文件夹
$ cd myproject
$ mkdir bin
bin/my_bin_file:
#!/usr/bin/env node
require('../main_file.js');
在你的 package.json 中添加一个“bin”选项:
"bin": {
"my_bin_file": "./bin/my_bin_file"
}
使其可执行
$ chmod +x bin/my_bin_file
全局安装:
npm install -g
编辑:npm 可以在不公开的情况下将您的包全局安装到系统中,并且 bin 文件中有一个 shebang 告诉系统如何调用它(无需在 cli 上显式调用 node)