2

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

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

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

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

然后,今天我在一个 javascript 文件中进行了单行修复,使用 编译了 application.js grunt watch,并意识到 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 代码?

4

1 回答 1

3

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

是的,这可能会发生并可能导致问题。尽管只要将依赖项版本指定为 eg "~1.2.3",影响就会受到限制,这将锁定主要/次要版本并且只允许补丁级别更新。

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

然而,目前的bower还没有这个功能——Github 上有关于它的讨论,例如这里

我认为目前有以下选项可以在您的情况下解决此问题:

  • 取消忽略并提交您的(非常丑陋,因为这会在gitbower_components中产生大量噪音)。
  • 将您的依赖版本指定到补丁级别,例如,"1.2.3"而不是"~1.2.3".
    • 罪魁祸首:如果您的依赖项有子依赖项,它们可能仍被指定在次要版本级别,这意味着即使您的直接依赖项具有可预测的版本,您的传递依赖项也可能没有。
  • 停止使用bower并改用npm(界面/可用性方面,它们几乎相同恕我直言)并用于npm shrinkwrap锁定您的依赖项。

干杯,亚历克斯

于 2015-12-01T10:34:12.700 回答