为什么Bower无法更新Angular并升级我的Angular?

14

我有 Angular 1.2.3,想升级到 1.2.7。

> cat bower.json
...
  "dependencies": {
    "json3": "~3.2.4",
    "jquery": "~1.9.1",
    "es5-shim": "~2.0.8",
    "toastr": "~2.0.1",
    "angular-ui-tinymce": "latest",
    "underscore": "~1.5.2",
    "underscore.string": "~2.3.3",
    "angular-ui-utils": "~0.0.4",
    "angular-dragdrop": "~1.0.5",
    "angular-cookies": "~1.2.3",
    "angular-animate": "~1.2.3",
    "angular-resource": "~1.2.3",
    "angular": "~1.2.3"
  },
  "devDependencies": {
    "angular-mocks": "~1.2.3",
    "bootstrap": "~3.0.1",
    "font-awesome": "~4.0.3",
    "angular-bootstrap-affix": "~0.3.0"
  }
...

我不知道以下输出甚至是什么意思......,它在做什么?

> bower update angular
bower angular#~1.x              cached git://github.com/angular/bower-angular.git#1.2.7
bower angular#~1.x            validate 1.2.7 against git://github.com/angular/bower-angular.git#~1.x
bower angular#>= 1.0.2          cached git://github.com/angular/bower-angular.git#1.2.7
bower angular#>= 1.0.2        validate 1.2.7 against git://github.com/angular/bower-angular.git#>= 1.0.2
bower angular#1.2.3             cached git://github.com/angular/bower-angular.git#1.2.3
bower angular#1.2.3           validate 1.2.3 against git://github.com/angular/bower-angular.git#1.2.3
bower angular#~1.2.3            cached git://github.com/angular/bower-angular.git#1.2.7
bower angular#~1.2.3          validate 1.2.7 against git://github.com/angular/bower-angular.git#~1.2.3
bower angular#~1.x                 new version for git://github.com/angular/bower-angular.git#~1.x
bower angular#~1.x             resolve git://github.com/angular/bower-angular.git#~1.x
bower angular#>= 1.0.2             new version for git://github.com/angular/bower-angular.git#>= 1.0.2
bower angular#>= 1.0.2         resolve git://github.com/angular/bower-angular.git#>= 1.0.2
bower angular#~1.2.3               new version for git://github.com/angular/bower-angular.git#~1.2.3
bower angular#~1.2.3           resolve git://github.com/angular/bower-angular.git#~1.2.3
bower angular#~1.x            download https://github.com/angular/bower-angular/archive/v1.2.8-build.2095+sha.28fc80b.tar.gz
bower angular#>= 1.0.2        download https://github.com/angular/bower-angular/archive/v1.2.8-build.2095+sha.28fc80b.tar.gz
bower angular#~1.2.3          download https://github.com/angular/bower-angular/archive/v1.2.8-build.2095+sha.28fc80b.tar.gz
bower angular#>= 1.0.2         extract archive.tar.gz
bower angular#>= 1.0.2        resolved git://github.com/angular/bower-angular.git#1.2.8-build.2095+sha.28fc80b
bower angular#~1.x             extract archive.tar.gz
bower angular#~1.x            resolved git://github.com/angular/bower-angular.git#1.2.8-build.2095+sha.28fc80b
bower angular#~1.2.3           extract archive.tar.gz
bower angular#~1.2.3          resolved git://github.com/angular/bower-angular.git#1.2.8-build.2095+sha.28fc80b

什么都没改变吗?我还是1.2.3版本。

> git diff
diff --git a/ngapp/app/bower_components/angular/.bower.json b/ngapp/app/bower_components/angular/.bower.json
index dc9d0b6..842a1f3 100644
--- a/ngapp/app/bower_components/angular/.bower.json
+++ b/ngapp/app/bower_components/angular/.bower.json
@@ -11,6 +11,6 @@
     "commit": "b112b099971f4cf016023bdeb00b267e9bf6dfb5"
   },
   "_source": "git://github.com/angular/bower-angular.git",
-  "_target": "~1.2.3",
+  "_target": "1.2.3",
   "_originalSource": "angular"
 }

> bower --version
1.2.8

我有什么遗漏吗?

> bower info angular
.... shows all versions including 1.2.7 and 1.2.8-builds as well
2个回答

17

我认为您的依赖关系阻止了您在隔离环境中更新angular。例如,查看bower_components/angular-route/bower.json文件。您将看到列出了特定版本的angular作为依赖项(“1.2.3”),而不是一个“~”或“相对接近”的限定符(“〜1.2.3”)。因此,您正在尝试仅更新angular,但由于其他包依赖于该版本,所以Bower所能带您更新的Angular版本最多只能是当前版本。

如果执行bower update命令,那么Bower将有机会更新所有包,包括阻止Angular更新的angular-route和其他包。这些包的更新现在将允许Bower更新Angular并满足依赖关系。另外,如果您确定了所有那些依赖于特定Angular版本的包(您可以使用bower list命令查看依赖项)并将它们作为参数传递给bower update angular angular-mocks angular-resource angular-route angular-sanitize...命令,则Bower也可以执行更新。


7

我认为这个问题与此有关

"angular": "~1.2.3" 

https://github.com/isaacs/node-semver/

"Reasonably close to 1.2.3". 

所以你应该用

来替换它。
"angular": "1.2.7" 

更新: (在评论中有提到,但我认为最好指出来)

请注意,您无法将软件包名称传递给更新命令并仅更新该个别软件包:它仍将更新所有软件包。您可以通过运行bower install来获取单个软件包的最新版本;它只会覆盖您当前拥有的版本。


我不太明白。所以我需要修改我的bower.json文件到1.2.7吗?然后运行bower install命令?你不能通过命令行升级一个包吗? - Homan
@Whistler 我认为 ~ 表示自动升级到当前版本为1.3。你能解释一下吗?谢谢! - michael
1
请注意,您无法将软件包名称传递给更新命令并仅更新该单个软件包:它仍将更新所有软件包。您可以通过运行 bower install <package> 来获取单个软件包的最新版本;它只会覆盖您当前拥有的版本。 - Whisher
3
我对这个用法还不太清楚。在我运行 bower update 后,git diff 显示 bower_components/angular 文件夹没有被修改,但是 bower_components/bootstrap 却被完全修改了。之后我运行了 bower install angular --save,它提示我选择不同的版本,最终我在安装过程中选择了1.2.7版本,这似乎改变了 bower_components 中的文件。那么为什么行为不一致呢?当我运行 bower update 时,它改变了所有的 bootstrap 文件,但却没有改变我的任何 angular 文件。 - Homan
除非,你是在说:在 bower.json 中指定特定版本会在运行 bower update 时将包锁定到这些版本,而在版本中指定波浪符 ~ 允许 bower update 升级到由 bower.json 描述的最接近的可接受版本... 因此,~3.0.1 允许升级到 3.0.3,但硬版本 1.2.3 不会带你去 1.2.7,甚至不会询问你。 - Homan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接