永久忽略 Bower 的一个依赖项。

49

我正在用 bower 下载 angular、angular-bootstrap 和 bootstrap。bootstrap 依赖于 jquery,但是在安装过程中已经安装了它。然而,由于我只使用了 bootstrap 的 css,因此在我的项目中不需要 jquery。

因此,我尝试永久删除对 jquery 的依赖:

bower uninstall jquery --save

我卸载了jQuery,但下一次我运行bower update时,它会再次下载。

有没有办法告诉Bower永久跳过一个依赖项?

编辑:我希望有类似这样的东西:

"resolutions": {
    "jquery": "no, thanks"
}
6个回答

72

Pull request #1394 已经正式支持该功能,并出现在 bower 1.6.3 及更高版本中。使用bower -v检查您的版本,运行npm install -g bower进行升级。

如需参考,请查看.bowerrc 官方规范文档。如果这对您没有用,请提交一个 bower 问题,因为这是一个错误。

我们可以像以下这样在我们的.bowerrc中使用它:

{
  "ignoredDependencies": [
    "bootstrap",
    "bootstrap-sass",
    "bootstrap-sass-official"
  ]
}

这个还没有合并吗? - Vic
我可以确认我也遇到了这个问题,所以这甚至不是完整的解决方案-https://github.com/bower/bower/pull/1394#issuecomment-73864285 - streetlogics
1
它在bower 1.7.0中不起作用,@pierrefevrier的答案帮了我一个大忙 https://dev59.com/cWEi5IYBdhLWcg3wyO44#32016391 - Ivan Kaplin
@IvanKaplin,对我来说它仍然有效,也许你有不同的问题。我的答案不是一个变通方法。这是bower的支持功能,如果它不起作用,我建议你与bower联系,而不是对我的回答进行负面评价。 - kross
https://github.com/bower/spec/blob/master/config.md#ignoreddependencies - sam
关于在1.7.0版本中无法工作的问题,我曾经遇到过类似的问题,在1.7.4版本中也无法工作(如果我没记错的话,现在我已经升级到了1.8.0版本)。请注意,后来有一个与此功能相关的缺陷被纳入了较晚的版本: https://github.com/bower/bower/issues/1962 - Kyle

25
我们曾经遇到过类似的情况,Backbone在它的bower.json中依赖于Underscore,但是我们使用的是Lo-Dash,因此每次安装时Bower都会不必要地下载Underscore。我们有第三方许可证合规性的自动化检查,所以我们不想有任何我们实际上不使用的内容。
我知道这不是Bower的本意,但是Bower的install-hooks可以用于在安装后清理不需要的依赖项(至少在Bower获得您暗示的“不需要”解决方案之前)。在您的.bowerrc中:
{
    "directory": "app/bower_components",
    "scripts": {
        "postinstall": "rm -rf app/bower_components/underscore"
    }
}

这有点像黑客行为,但是有效。


3
有趣的解决方案!但是它并没有解决使用诸如wiredep之类的工具而不进行配置的问题 :( - stevemao

14

你还可以在你的 bower.json 文件中进行以下操作:

{
  "dependencies": {
    ...
    "bootstrap": "^3.2.0"
  }
  "overrides": {
    "bootstrap": {
      "dependencies": []
    }
  }
}
这意味着:删除所有Bootstrap的依赖项,这正是你想要的,因为jQuery是唯一的(你可以使用bower info bootstrap进行检查)。

这实际上不被Bower支持,是吗? - JKillian
据我所知,它目前还不是规范的一部分:https://github.com/bower/bower.json-spec/pull/27 - JKillian
3
需要特定版本的Bower才能使此工作吗?我安装了最新的1.7.1版本,但无法正常工作。 - Riina

5
如果您提交依赖项,请将其添加到您的.gitignore中。否则,保留它不会有任何影响。您应该只使用您需要的内容并忽略其余部分。

1
我还没有提交依赖项。所以我知道不能跳过它,我会保持现状。谢谢。 - François Romain
1
我认为这不是正确的方法...一个收缩包装非常必要。 - stevemao
1
当你打包你的脚本但又想要留出那些从CDN加载的库时,这确实有所不同。我已经通过bower安装了一个angular库,它会与我的js应用程序一起打包,但是我通过Google CDN提供了angular本身。让bower忽略这个依赖项可以使捆绑变得更加容易。 - jminuscula
它还会影响使用集成开发环境的用户;例如,我不希望所有的Bootstrap CSS类干扰我的自动完成。 - thinice
我也处于CDN场景中。 - sam

1
上述答案是正确的,但另一种解决方案是使用wiredep,如此答案所述:
在安装了grunt-wiredep之后,您可以将类似以下内容添加到您的Grunt.js中,以排除jquery被注入:
// Automatically inject Bower components into the app
wiredep: {
  options: {},
  app: {
    src: ['<%= my.app %>/index.html'],
    exclude: ['bower_components/jquery']
  }
},

Bower仍会下载jQuery,但至少你可以告诉它不要包含在HTML src中。

1

免责声明:本方法不能解决所有问题,但对于我的问题有所帮助,或许也能帮到其他人。

我正在使用grunt-bower-task将文件拉入lib目录。我想排除"angular",只包含"angular.js"。我的某个依赖项中包含了"angular"。现在我的文件中是这样的:

{
  "name": "myapp",
  "version": "0.0.1",
  "dependencies": {
    "angular.js": "1.3.15",
    "angular-bootstrap": "0.13.0",
    "angular-cookies": "1.3.15",
    "angular-storage": "0.5.0",
    "angular-ui-router": "0.2.15",
    "mjolnic-bootstrap-colorpicker": "2.1"
  },
  "exportsOverride": {
    "angular": {
      "dump": "*.xxx"
    },
    "angular.js": {
      "js": [ "*.js", "*.js.map" ],
      "css": "*.css"
    }
  },
  "resolutions": {
    "angular": "1.3.15"
  }
} 

在我的 `gruntfile.js` 文件中,我有以下内容:
bower: {
    install: {
        options: {
            targetDir: './lib',
            layout: 'byType',
            install: true,
            cleanTargetDir: true,
            cleanBowerDir: false
        }
    }
},

这将阻止将“angular”文件复制到目标位置。

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