0

有谁知道如何实现从命令行执行节点 bash proram,例如您可能调用“brew install”的方式 - 通常,您需要调用“node NAME_OF_CLI ”。

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

另外,我不希望它出现在 npm 中——这不是公共模块。

4

2 回答 2

1

这就是我要做的。

在传统存档中分发您的程序

  • 将您的程序打包成一个可分发的存档,例如 .tar.bz2(首选)、.tar.gz 或 .zip(如果它需要支持 Windows)
  • 在存档中包含节点本身、您完全填充的 node_modules 文件夹以及所有其他 javascript 模块、文件等
  • 因为节点依赖于平台,因此您需要为每个目标架构(linux/windows/osx)使用不同的归档分发
  • 以上这些与12 Factor App Build/Release/Run 原则是一致的。
  • 包含一个可执行的 shell 脚本,它是您的程序的入口点,可以执行类似的操作

包括一个可执行的 shell 脚本包装器

#!/bin/sh
DIR=$(dirname "${0}")
exec "${DIR}/node/bin/node" "${DIR}/main.js" "${@}"

通过 curl 命令行复制/粘贴安装

我在评论中注意到您想要一个自制风格的 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原则是一致的,这些原则是合理的。尤其是:

  • 不要期望目标用户已经安装了节点
  • 不要期望目标用户按照您的指示安装节点
  • 除非您确实需要这样做,否则不要费心尝试支持不同版本的节点
  • 可以将 node 与您的应用程序捆绑在一起。它使安装更容易,更容易支持,并且更不容易出错。

其他提示

  • 确保您的安装程序代码是幂等的
  • 您可能希望在脚本中明确设置目标计算机上的包装器 shell 脚本可执行文件chmodinstall.shzip 存档,并且 tar 在某些情况下不会保留它
  • 当心 OS X 的蹩脚的旧tar. 改为使用gnutar

参考资料

参考自制的goruby​​ 程序的想法/灵感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" .
}
于 2013-05-31T15:04:47.683 回答
0

将文件添加到 ./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)

于 2013-05-31T14:37:09.513 回答