存在使用bower install安装指定代码库的min.js/css的方法么?

听说bower是十分流行的前端包管理工具,于是我慕名试用了一下……
使用bower install jquery安装最知名的js框架,嗯,很顺利的下了下来,果然比手动下载要快。而且让人喜出望外的是,下下来的不止一个,也不止几个文件……而是几乎有半个jquery的版本库……真是意外惊喜啊!然后我尝试使用各种方法,折腾了一个晚上,还是找不到只让它仅仅下载min文件的办法。


如果考虑到在一大堆文件中扒拉出min.js/css文件的花费,似乎并不比手工完成繁琐多少。以本人第一印象,感觉除非自己要根据一些前端库来搭建一个前端框架,否则没有必要使用bower。如果存在一种工具,自动地从一个CDN列表中下载符合版本所需的前端库的min文件,是不是会比bower更好用呢……

额,差点忘了我的问题。存在一种用bower install来安装min.js/css文件的方法么?或者换个说法,大家是怎么处理下下来的许多源文件的?直接删掉绝大部分么?

顺便搭车问一下,如果你在项目中用到bower(前端项目除外!),为什么你需要用它?你是怎么用它的?

阅读 19.7k
4 个回答

tl;drBower 这样的包管理工具,其主要目的是为了管理包和包之间的依赖关系(基于版本的管理),帮你下载源代码只是管理依赖必须要有的一个步骤。如果你只是想要一个或若干个特定文件,但并不在乎依赖关系,Bower 会显得过重了一些,至于你想要的:

自动从一个 CDN 列表中下载符合版本所需的前端库的 min 文件

其实有大把现成的工具可以利用,比如说 curl 就可以,根据需要写一个简单的脚本,或者使用 Grunt 这样的任务运行器帮你跑命令行命令就可以了。顺便一提:CDN 不应该是这么用的。

为什么 Bower 下的包里有一大堆看起来用不着的东西?

Bower 是基于 Git 之上的包管理工具,它提供的包其源头都是一个 Git 库(多数都在 Github 上,但并非必须),这是为了利用 Git 对这些包进行版本控制。然而,并不是任何一个 Git 库都会被 Bower 索引,能够通过 Bower 下载的包,在其 Git 库下都会有一个 bower.json 文件,Bower 通过检索 bower.json 的内容来注册一个包(及其依赖),于是以后就可以搜索到了。

因此,我们在 Bower 上搜索到的可下载包,它们大部分都是这些包的源代码 Git 库,并且我们都知道 这些源代码通常都是没有编译/构建过的,所以你会看到一大堆“半成品”似的文件,这对于最终使用者来说的确显得多余。

然而上述信息也给了我们一个提示,(如果你有精力的话)你可以自行管理一个只包括发行版文件的对应 Git 库,你只需要把必要的文件摘出来,提供一个 bower.json 描述文件,然后托管在一个可访问到的 Git Server 上(比如 Github)即可。具体的注册方法可以参见 Bower 的文档。另外一个包管理工具(实际上是一种规范)Component 几乎就是这么做的。

难道就没有办法只获取我需要的文件?

当然有办法。比如说 Grunt(一种任务运行器,常被用作前段项目的构建工具,使用 Bower 的项目几乎没有不用 Grunt 或者其他类似工具的)就有几个提供抽取需要文件的插件。这里推荐 grunt-bowercopy,用法比较简单,放张截图就明白了:

请输入图片描述

如图所示,你提供一个 目标: 源 的映射,grunt-bowercopy 会自动帮你提取 Bower 下载的包里需要的文件并拷贝到你指定的路径去。(你也可以把路径相同的部分抽象出来,方便重用/修改,别学我懒……)

这种事情只要做一次就好,之后都是 Grunt 帮你完成自动化过程。

一些连带的细节问题

Bower 默认把包安装在 bower_components 目录下,关于这个有两点值得考虑的:

  • 首先这个路径可以改,创建一个 .bowerrc 文件,包括一下内容:
{
    "directory": "vendor"
}

这样 Bower 就会使用 vendor 作为存放路径了。

  • 为什么要改呢?因为根据情况你可能要决定是否要把 Bower 下载的包 check in 到项目的版本管理之中。简言之,由于多种因素的影响(见前面的链接),如果你做的是一个不可重用的项目(比如一个 web app),请把 Bower 下载的包也 check in,反之(一个通用库,一个 Node.js 库等)则不要这么做——意味着你没必要自定义保存路径的名字。

除此之外,Bower 还有一些细微之处可以帮助你做(好)更多的事情。举例,--offline 标识可以让 Bower 去寻找本地缓存(比如说你其他的项目以前已经安装过你需要的包,因此会在本地留下缓存),这样可以大幅提高安装速度。

再比如说有很多库专门为前面提到过的 Component 预留了发行版,通常都保存在项目的 components/ 路径下或者以组织的名义为该项目创建一个 components 代码库,用于跟踪和存放发行版本,于是你可以覆盖 Bower 默认的 shorthand,像这样:

{
    "shorthand-resolver": "git://github.com/{{owner}}/components/{{package}}.git"
}

这也是写在 .bowerrc 中的。这样你就可以用 Bower 工具来“偷取”本来准备给 Component 的包了。如果你为企业服务,有数量庞大的项目和团队需求,你完全可以架设一个私有的 Bower Endpoint Server,自行维护一些需要的包源代码,这样一来你想怎么做都随你,其实也很简单,无非就是维护一个版本管理服务器罢了。

Anyway,对于大多数最终应用的开发者而言,Bower 真就当一个下载器来用了,但它本来的目的真不是为了这个,它更加适合用于开发可重用的库/框架等。如果你只是写点小玩意,需要几个文件,倒真不如直接 curlwget 之类的更直接方便。

不在乎可以下下来,在乎可以自动下你才能自动构建

想想问什么要后端包管理,为什么要bundle, maven... 道理是一样的, 那些包你可以自己下,但是只有能自动管理依赖,才能用构建工具provision一个能用的环境并且测试,构建,发布.

hi我遇到了和你一样的问题,很郁闷,看了大家的评论,有了一点自己的想法, 我遇到的问题主要是 bower把整个库都拉下来了,然后再放入vcs里时就很郁闷了,多用几个库,就废了
1.首先应该使用自动化工具 自动从包里拉出所需的文件
2.将拉下的库 不放入vcs
3.搞个自动化工具,拉去代码时,自动安装下全部依赖库,bower好像没这功能,坑啊

我也遇到同样的问题

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏