Skip to content
This repository has been archived by the owner on Oct 12, 2018. It is now read-only.

multiple source/dest concats? #52

Open
toddzebert opened this issue Jul 16, 2015 · 13 comments
Open

multiple source/dest concats? #52

toddzebert opened this issue Jul 16, 2015 · 13 comments

Comments

@toddzebert
Copy link

Something like:

bower_concat: {
  js_header: {
    include: [
      'package_1',
      'package_2'
      ],
    dest: 'build/_bower_header.js',
  },
  js_footer: {
    include: [
      'package_3',
      'package_4'
      ],
    dest: 'build/_bower_footer.js',
  },
  js_other: {
    include: [
      'package_1',
      'package_4'
      ],
    dest: 'build/_bower_other.js',
  },
}
@sapegin
Copy link
Owner

sapegin commented Jul 16, 2015

I suppose you have read docs for Grunt and this plugin, add this code to your Gruntfile and it didn’t work as you expected (of course after reading the docs). But you were so exhausted that you forgot to describe what was wrong. Please do that now.

@toddzebert
Copy link
Author

I was expecting something along with way concat works with tasks like 'dev' and 'dist' and within them files: [ { src: {}, dest: {} }, { src: {}, dest: {} }, /* etc */ ]

It seems I have to make each set of files a diff task, so while this ran without error:

module.exports = function(grunt) {

  grunt.initConfig({

    bower_concat: {
      a_js: {
        include: [
          'bower-test-a' // no dependencies
        ],
        dest: 'a.js'
        // cssDest: 'a.css',
      },
      b_js: {
        include: [
          'bower-test-b' // has -a as dependency
        ],
        dest: 'b.js'
        // cssDest: 'b.css',
      },
      bandc_js: {
        include: [
          'bower-test-b', // has -a as dependency
          'bower-test-c' // no dependencies
        ],
        dest: 'bandc.js'
        // cssDest: 'bandc.css',
      },
      all: {
        dest: 'all.js'
        // cssDest: 'all.css',
      }
    }

  });

  grunt.loadNpmTasks('grunt-bower-concat');

  grunt.registerTask('default', [
    'bower_concat:a_js',
    'bower_concat:b_js',
    'bower_concat:bandc_js',
    'bower_concat:all'
    ]);

};

It did not pull in dependencies from bower, ex: b_js created b.js with bower-test-b but without it's dependency bower-test-a.

All of bower-test-* have a bower.json with mainfile (which grunt -v shows as being found) and dependencies set (which work since bower pulls in dependencies).

So does using an 'include' exclude dependencies? Or what am I doing wrong?

@sapegin
Copy link
Owner

sapegin commented Jul 17, 2015

Yep, include makes it more like regular concat. Because otherwise you could have the same component in a few different bundles (if components from that bundles depend on it) which is not what you want when you’re creating separate bundles (for example, for different pages).

@toddzebert
Copy link
Author

Hmmm. What I want is to not load all my JS on every page, so to be able to create separate bundles per (type of) page, but still not have to worry about dependencies and concat order (because that's already defined in Bower).
I've been searching everywhere but I can't find a solution. Any thoughts?

@sapegin
Copy link
Owner

sapegin commented Jul 17, 2015

They will be in the right order, no matter in which order you specify them in the include. But you need to specify all dependencies too.

I’m not sure how to make it better.

@toddzebert
Copy link
Author

Yeah, I don't want to have to specify dependencies - that's what I was doing before manually with regular concat.

Perhaps an option that turns on dependency loading even when using include, with a warning if you're not using it correctly you could load some packages twice?

@sapegin
Copy link
Owner

sapegin commented Jul 17, 2015

Yeah, that would work. It would be great if you could create a pull request with that feature.

@toddzebert
Copy link
Author

I'm not up on creating Grunt plugins, but I know JS.

It looks like the section in question that short circuits the dependency checking/loading is this in function bowerMainFiles() :

 _.each(lists.components, function(component, name) {
  if (includes.length && _.indexOf(includes, name) === -1) return;
  if (excludes.length && _.indexOf(excludes, name) !== -1) return;

I'm thinking a "forceDependencies" option that overrides the above if statements with a (!options.forceDependencies) conditional.

If I'm on right track it seems like it shouldn't be too difficult for me to add this functionality in a PR.

@Shino-
Copy link

Shino- commented Jul 17, 2015

I think I'm having the same problem. Given the example given here, it looks like we should be able to do it, but grunt tells me Required config property "bower_concat.subitem" missing when I try to do bower_concat:subitem and You should specify "dest" and/or "cssDest" properties in your Gruntfile when I try to do bower_concat.

That said, there's a possibility that my syntax is wrong somewhere... but I triple checked it, and even rebuilt it from scratch using the example.

@sapegin
Copy link
Owner

sapegin commented Jul 17, 2015

@Shino-, until you show me your gruntfile I could’t tell you what’s wrong with it.

@sapegin
Copy link
Owner

sapegin commented Jul 17, 2015

@toddzebert, I think it would be easier to add all the dependencies of “included” components to the include array itself before _.each(lists.components loop at line 97.

And I don’t like the name forceDependencies. Probably something like includeWithDependencies would be more clear.

@Shino-
Copy link

Shino- commented Jul 17, 2015

@sapegin ok, here's the current version of the task with only one element.

'use strict';

module.exports = function bower_concat(grunt) {
    // Load task
    grunt.loadNpmTasks('grunt-bower-concat');

    // Options
    return {
        bower_concat: {
            components: {
                dest: 'public/js/components.js',
                dependencies: {
                    'jquery-ui': 'jquery',
                    'jquery-cookie': 'jquery',
                    'jquery-validation': 'jquery',
                    'dustjs-linkedinhelpers': 'dustjs-linkedin'
                },
                exclude: [
                    'doc-ready',
                    'eventEmitter',
                    'eventie',
                    'fizzy-ui-utils',
                    'get-size',
                    'get-style-property',
                    'jquery-hashchange',
                    'jquery-mobile-bower',
                    'jquery-mobile',
                    'jquery-ui-tabs',
                    'matches-selector',
                    'outlayer'
                ],
                mainFiles: {
                    'jquery': 'dist/jquery.min.js',
                    'modernizr': 'modernizr.js',
                    'jquery-ui': ['ui/effect.js','ui/effect-puff.js','ui/effect-scale.js','ui/effect-size.js'],
                    'imagesloaded': 'imagesloaded.pkgd.min.js',
                    'masonry': 'dist/masonry.pkgd.min.js',
                    'jquery-cookie': 'jquery.cookie.js',
                    'dustjs-linkedin': 'dist/dust-core.min.js',
                    'dustjs-linkedin-helpers': 'dist/dust-helpers.min.js',
                    'jquery-validation': 'dist/jquery.validate.min.js'
                }
            }
        }
    };
};

The gruntfile has grunt.registerTask('build', [ 'stuff', 'bower_concat:components', 'otherstuff' ]);.

@toddzebert
Copy link
Author

@Shino- While I think you have a different issue than I, I don't see any problem with your bower_concat syntax. Although, I'm not familiar with your use of return-ing the options - in my file I use grunt.initConfig() which works correctly (although not as I hoped).

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants