Javascript 打包节点bash CLI以从/usr/local/bin/文件夹执行

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_文件

是否有人知道如何从命令行执行node bash程序,例如您可能会调用“brew安装”的方式?通常,您需要调用“nodeNAME\u OF_CLI

问题是我不能把我的程序扔进/bin文件夹,因为我需要把node_modules文件夹也放在那里——这似乎是不可接受的。是否有一种已知的方法将所有这些东西打包在一起,使其成为一个可执行程序


另外,我不希望它出现在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脚本,它是程序的入口点,可以执行以下操作
包括一个可执行的shell脚本包装器 通过curl命令行复制/粘贴安装 我在评论中注意到,您希望通过curl命令行进行自制式安装。在这种情况下,上述所有内容仍然适用,但curl命令会下载一个shell脚本,该脚本执行以下操作:

  • 下载分发档案
  • 将其提取到位(
    /usr/local/programname
    比较合理)
  • 如有必要,设置符号链接或将文件复制到用户路径中的
    bin
    目录中(
    /usr/local/bin/programname
    将是合理的)
因此,curl命令可能是
curlhttp://example.com/myprogram/install.sh |sh

同样,这与合理的原则是一致的。特别是:

  • 不要期望目标用户已经安装了节点
  • 不要期望目标用户按照您的指示安装节点
  • 除非您确实有这样做的需求,否则不要尝试支持不同版本的节点
  • 可以将节点与应用捆绑在一起。它使它更易于安装,更易于支持,更不容易出错
杂项提示
  • 确保您的安装程序代码是正确的
  • 您可能希望在目标计算机上使用
    install.sh
    脚本中的
    chmod
    显式地将包装器外壳脚本可执行文件设置为zip存档,在某些情况下tar不会保留该文件
  • 小心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" .
}