Javascript 打包节点bash CLI以从/usr/local/bin/文件夹执行
是否有人知道如何从命令行执行node bash程序,例如您可能会调用“brew安装”的方式?通常,您需要调用“nodeNAME\u OF_CLI” 问题是我不能把我的程序扔进/bin文件夹,因为我需要把node_modules文件夹也放在那里——这似乎是不可接受的。是否有一种已知的方法将所有这些东西打包在一起,使其成为一个可执行程序Javascript 打包节点bash CLI以从/usr/local/bin/文件夹执行,javascript,node.js,command-line,command-line-interface,Javascript,Node.js,Command Line,Command Line Interface,是否有人知道如何从命令行执行node bash程序,例如您可能会调用“brew安装”的方式?通常,您需要调用“nodeNAME\u OF_CLI” 问题是我不能把我的程序扔进/bin文件夹,因为我需要把node_modules文件夹也放在那里——这似乎是不可接受的。是否有一种已知的方法将所有这些东西打包在一起,使其成为一个可执行程序 另外,我不希望它出现在npm中-这不是一个公共模块。向/bin文件夹添加一个文件 $ cd myproject $ mkdir bin bin/my_bin_文件
另外,我不希望它出现在npm中-这不是一个公共模块。向/bin文件夹添加一个文件
$ cd myproject
$ mkdir bin
bin/my_bin_文件:
#!/usr/bin/env node
require('../main_file.js');
将“bin”选项添加到package.json:
"bin": {
"my_bin_file": "./bin/my_bin_file"
}
使其可执行
$ chmod +x bin/my_bin_file
全局安装:
npm install -g
编辑:npm可以在不公开的情况下将您的包全局安装到系统中,并且bin文件中有一个shebang,告诉系统如何调用它(无需显式调用cli上的节点)下面是我要做的 在传统存档中分发您的程序
- 将您的程序打包到可分发的归档文件中,如.tar.bz2(首选)、.tar.gz或.zip(如果需要支持windows)
- 在归档文件中包括节点本身、完全填充的node_modules文件夹以及所有其他javascript模块、文件等等
- 由于节点依赖于平台,因此每个目标体系结构(linux/windows/osx)都需要不同的归档分发
- 以上这些与构建/发布/运行原则一致
- 包括一个可执行的shell脚本,它是程序的入口点,可以执行以下操作
- 下载分发档案
- 将其提取到位(
比较合理)/usr/local/programname
- 如有必要,设置符号链接或将文件复制到用户路径中的
目录中(bin
将是合理的)/usr/local/bin/programname
curlhttp://example.com/myprogram/install.sh |sh
同样,这与合理的原则是一致的。特别是:
- 不要期望目标用户已经安装了节点
- 不要期望目标用户按照您的指示安装节点
- 除非您确实有这样做的需求,否则不要尝试支持不同版本的节点
- 可以将节点与应用捆绑在一起。它使它更易于安装,更易于支持,更不容易出错
- 确保您的安装程序代码是正确的
- 您可能希望在目标计算机上使用
脚本中的install.sh
显式地将包装器外壳脚本可执行文件设置为zip存档,在某些情况下tar不会保留该文件chmod
- 小心OSX的破旧的
。改用tar
gnutar
go
ruby程序
下面是中构建脚本的一些示例
另外,我不想隐式地调用“node”——所以我把它作为我的路径。这似乎是可行的,但我只是想明确一点,我正在寻找一个解决方案,其中不包括手动调用node lyah。。。我尝试了“npm链接”,但它与回购协议有一个符号链接。这两种解决方案都不好,因为我不想让用户做这些事情。我希望他们能够将我的程序卷曲到他们的/bin目录中,并立即开始使用它。然后您可以编写一个小的shell脚本,只需下载您的包并运行npm install-g。就我所知,没有其他方法可以将它们打包为单一的二进制样式。除了“npm安装-g”之外的所有东西都是你这一方的一次性产品。真的!非常感谢。实际上,我可能会使用npm链接选项,这样回购协议就可以生效,用户可以继续提取更新的程序,该程序将自动进行符号链接。但我当然很想知道我最初的想法是可能的。谢谢
#!/bin/sh
DIR=$(dirname "${0}")
exec "${DIR}/node/bin/node" "${DIR}/main.js" "${@}"
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" .
}