Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Exclude folders from builds in Brocfile

Is there a way to exclude a folder from a build in a Brocfile (or any other place). The use case is packaging, where I have an app made of sub-apps within pods. eg.

/app/modules/components
/app/modules/app1
/app/modules/app2
/app/modules/app3

I'd like to build them all when environment is set to 'development' or only eg. 'app1' when environment is 'app1'. Any suggestions?

I have tried different combinations of broccoli-file-remover, broccoli-funnel and broccoli-merge-trees to no avail.

var removeFile = require('broccoli-file-remover');

module.exports = removeFile(app.toTree(), {
    paths: ['app/modules/pod1/', 'app/modules/pod2/']
});
like image 436
WooDzu Avatar asked Jun 06 '15 18:06

WooDzu


People also ask

How do I exclude files or folders from my build?

Excluding files or folders from builds To exclude files or folders when building a SPL application or toolkit, create a .buildignorefile in the root of your SPL application or toolkit folder.

How do I exclude a file or directory from a project?

You can explicitly exclude that file or directory from the list of inputs. There may also be a file in a project that you only want to include under certain conditions. You can explicitly declare the conditions under which a file is included in a build.

Can I exclude a file from the list of inputs?

However, there might be one file in the directory or one directory in a nested set of directories that you do not want to include as input for a build. You can explicitly exclude that file or directory from the list of inputs. There may also be a file in a project that you only want to include under certain conditions.

How to remove unneeded files and folders in post_build?

Thus, based on the comments, the easiest solution to the problem was to simply delete unneeded files and folders in the post_build stage. 1 Solution = exclude in .gitingnore file. 2 Solution = add this in below your code.


1 Answers

Ah, so after actually thinking about this clearly, everything is actually working exactly as expected in my previous example.

I clearly wasn't paying enough attention. app.toTree() is far too late to perform this operation, as everything has already been built and concated.

Luckily, ember-cli does enable addons to modify the appropriate trees at various life cycle milestones.

See: https://github.com/ember-cli/ember-cli/blob/master/ADDON_HOOKS.md for more details on which hooks are currently available.

The hook that should do the trick is Addon.prototype.postprocessTree. Now we have two choices, we can build a standalone addon, via ember addon or we can create a light-weight in-repo addon via ember g in-repo-addon. Typically for these types of situations, I prefer in-repo-addons as they don't require a second project, but otherwise they are the same.

  1. ember g in-repo-addon remove
  2. we need to install broccoli-stew via npm install --save broccoli-stew
  3. include it var stew = require('broccoli-stew');
  4. add hook postprocessTree to the add-on
  5. when the postprocessTree is for the type we care about, use broccoli-stew to remove the directories we no longer care care.

The resulting pull request: https://github.com/WooDzu/ember-exclude-pod/pull/1

Note: I noticed template wasn't one of the types available in postprocess, so I added it: https://github.com/ember-cli/ember-cli/pull/4263 (should be part of the next ember-cli release)

Note: we really do want an additional hook Addon.prototype.preprocessTree, as to ignore the files before we even build them. I have opened a related issue: https://github.com/ember-cli/ember-cli/issues/4262

output of the above steps

var stew = require('broccoli-stew');

module.exports = {
  name: 'remove',

  isDevelopingAddon: function() {
    return true;
  },

  postprocessTree: function(type, tree){
    if (type === 'js' || type === 'template')   {
      return stew.rm(tree, '*/modules/pod{1,2}/**/*');
    } else {
      return tree;
    }
  }

};
like image 163
Stefan Penner Avatar answered Oct 06 '22 06:10

Stefan Penner