Scrupulously manage file locations for bower dependencies.
Wrangle those bower dependencies and place each one where it's supposed to be.
bower_componentsdirectory.
Whenever you add a new bower dependency, add which file should be copied and where to your Gruntfile
"bowercopy"config. Then, run
grunt bowercopy.
By default, bowercopy runs
bower installfor you (turn this off with the
runboweroption). Your bower directory is not removed so you can see which files you need from each component. It is suggested that you add the bower directory (usually
'bower_components') to your
.gitignore.
This plugin requires Grunt.
If you haven't used Grunt before, be sure to check out the Getting Started guide, as it explains how to create a Gruntfile as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:
npm install grunt-bowercopy --save-dev
Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:
grunt.loadNpmTasks('grunt-bowercopy');
Note: have a look at load-grunt-tasks so you can skip this step for all your grunt plugins.
In your project's Gruntfile, add a section named
bowercopyto the data object passed into
grunt.initConfig().
grunt.initConfig({ bowercopy: { options: { // Task-specific options go here }, your_target: { // Target-specific file lists and/or options go here } } });
Type:
String
directoryproperty value in your
.bowerrcor
'bower_components'if the
.bowerrccannot be found.
srcPrefixwill prefix your source locations with the correct bower folder location.
Type:
String
''
destPrefixwill be used as the prefix for destinations.
Type:
Boolean
true
Run
bower installin conjunction with the
bowercopytask.
Type:
Boolean
true
Report any modules in your bower.json that have not been configured to copy at least one file with
bowercopy.
Note: The clean option reports the same thing, so this option is ignored if clean is true.
Type:
Boolean
false
Removes the bower components directory on completion. The folder path that is removed is
options.srcPrefix.
Note: the directory will only be removed if the following conditions are met.
grunt bowercopyand not
grunt bowercopy:target).
Type:
Array
[]
Using the
reportor
cleanoption,
grunt-bowercopytracks which dependencies have at least one file copied. The
ignoreoption can be used to specify any bower dependencies that aren't copied, but need to be defined in your
bower.jsonanyway.
Type:
Object
{}
Options to pass to
grunt.file.copywhen copying the files. See grunt.file.copy
grunt.initConfig({ bowercopy: { options: { // Bower components folder will be removed afterwards clean: true }, // Anything can be copied test: { options: { destPrefix: 'test/js' }, files: { // Keys are destinations (prefixed with `options.destPrefix`) // Values are sources (prefixed with `options.srcPrefix`); One source per destination // e.g. 'bower_components/chai/lib/chai.js' will be copied to 'test/js/libs/chai.js' 'libs/chai.js': 'chai/lib/chai.js', 'mocha/mocha.js': 'libs/mocha/mocha.js', 'mocha/mocha.css': 'libs/mocha/mocha.css' } }, // Javascript libs: { options: { destPrefix: 'public/js/libs' }, files: { 'jquery.js': 'jquery/jquery.js', 'require.js': 'requirejs/require.js' }, }, plugins: { options: { destPrefix: 'public/js/plugins' }, files: { // Make dependencies follow your naming conventions 'jquery.chosen.js': 'chosen/public/chosen.js' } }, // Less less: { options: { destPrefix: 'less' }, files: { // If either the src or the dest is not present, // the specified location will be used for both. // In other words, this will copy // 'bower_components/bootstrap/less/dropdowns.less' to 'less/bootstrap/less/dropdowns.less' // See http://gruntjs.com/configuring-tasks#files for recommended files formats src: 'bootstrap/less/dropdowns.less' } }, // Images images: { options: { destPrefix: 'public/images' }, files: { 'account/chosen-sprite.png': 'chosen/public/chosen-sprite.png', 'account/[email protected]': 'chosen/public/[email protected]' } }, // Entire folders folders: { files: { // Note: when copying folders, the destination (key) will be used as the location for the folder 'public/js/libs/lodash': 'lodash', // The destination can also be a folder // Note: if the basename of the location does not have a period('.'), // it is assumed that you'd like a folder to be created if none exists // and the source filename will be used 'public/js/libs': 'lodash/dist/lodash.js' } }, // Glob patterns glob: { files: { // When using glob patterns, destinations are *always* folder names // into which matching files will be copied // Also note that subdirectories are **not** maintained // if a destination is specified // For example, one of the files copied here is // 'lodash/dist/lodash.js' -> 'public/js/libs/lodash/lodash.js' 'public/js/libs/lodash': 'lodash/dist/*.js' } }, // Glob without destination globSrc: { options: { destPrefix: 'public/js/libs' }, // By not specifying a destination, you are denoting // that the lodash directory structure should be maintained // when copying. // For example, one of the files copied here is // 'lodash/dist/lodash.js' -> 'public/js/libs/lodash/dist/lodash.js' src: 'lodash/**/*.js' }, // Main pragma // Adding :main to the end of a source path will retrieve the main file(s) for that package // If the main property is not specified by a package, bowercopy will fail main: { src: 'jquery.minlight:main', dest: 'public/js/plugins/' } } });
Follow the same coding style present in the repo and add tests for any bug fix or feature addition.
See the CONTRIBUTING.md for more info.
ignoreoption.
options.report. Camelcase
options.runBower. Fix an issue with a source format (gh-9).
options.copyOptionsto be passed along to
grunt.file.copyand fix issue with local-only bower usage.
Copyright (c) 2014 Timmy Willison. Licensed under the MIT license.