在生产中部署时 运行 "bower install" 是不好的做法吗?

Is bad practice to run "bower install" when deploying in production?

我正在开发一个使用 bower.js 的应用程序;这是我第一次使用 Bower,如果您在我的问题描述中发现任何明显错误,请指正我。

-------------------------------------------- ---

来自 Ruby 背景,我希望包管理器有一个 .lock 文件,在 git 下跟踪,它准确地告诉我当前正在使用的版本。 Bower 似乎不会发生这种情况(我说得对吗?)。

几天前,我删除并重新克隆了我的存储库,运行 bower install,认为这样的命令只会安装所需版本的 js 组件。

然后,今天我在一个javascript文件中做了一行修复,使用grunt watch编译application.js,发现application.js被自动填充了我不知道来自 Bower 组件更新的大量新代码。

我发现我们的 bower 组件在 .gitignore 下,而我 运行 几天前的 bower install 实际上在没有我的情况下更新了两个组件注意到了。

当我意识到发生了什么事时,我立即查看了我们的部署过程,我将其粘贴在这里:

bundle install --path ${SNAP_CACHE_DIR}/.bundle
npm install -g bower grunt-cli
bower cache clean && bower install && bower list
bundle exec cap [our application name] deploy

这很危险吗? bower install 是否会更新所有可能未在我的本地版本中更新且未被 git 跟踪的组件,最终在生产中具有完全不同的 js 代码?

Is this dangerous? Will bower install update all the components, that are likely not updated in my local version and are not tracked by git, ending up having completely different js code in production?

是的,这可能会发生并且会导致问题。尽管只要您的依赖版本指定为例如,影响将是有限的。 "~1.2.3",这将锁定 major/minor 版本,只允许补丁级别更新。

bower 相比,通常在 node.js 环境中使用的包管理器 - npm - 具有一个名为 npm shrinkwrap 的 feature/command,它会创建一个 npm-shrinkwrap.json 文件,该文件会锁定您的依赖版本,以便之后 运行 npm install 是安全的。 这可能是您想要的。

然而,bower 目前还没有这个功能 - Github 上正在讨论它,例如here.

我认为目前有以下方案可以解决您的问题:

  • 取消忽略并提交您的 bower_components(非常难看,因为这会在 git 中产生大量噪音)。
  • 指定你的依赖版本到补丁级别,例如"1.2.3" 而不是 "~1.2.3"
    • 罪魁祸首:如果您的依赖项具有子依赖项,它们可能仍会在次要版本级别上指定,这意味着即使您的直接依赖项具有可预测的版本,您的传递依赖项也可能不会。
  • 停止使用 bower 并使用 npm(interface-/usability-wise,恕我直言,它们几乎相同)并使用 npm shrinkwrap 锁定您的依赖关系。

干杯,亚历克斯