2015-06-06 8 views
9

Gibt es eine Möglichkeit, einen Ordner von einem Build in einer Brocfile (oder einem anderen Ort) auszuschließen. Der Anwendungsfall ist Verpackung, wo ich eine App habe, die aus Sub-Apps in Pods besteht. z.B.Ordner aus Builds in Brocfile ausschließen

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

Ich möchte sie alle erstellen, wenn die Umgebung auf "Entwicklung" oder nur zB eingestellt ist. 'app1' wenn die Umgebung 'app1' ist. Irgendwelche Vorschläge?

Ich habe verschiedene Kombinationen von Brokkoli-Datei-Entferner, Brokkoli-Trichter und Brokkoli-Merge-Bäume vergeblich versucht.

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

module.exports = removeFile(app.toTree(), { 
    paths: ['app/modules/pod1/', 'app/modules/pod2/'] 
}); 

Antwort

2

Ah, so nach tatsächlich darüber klar zu denken, funktioniert alles tatsächlich genau wie erwartet in meinem vorherigen Beispiel.

Ich war eindeutig nicht genug Aufmerksamkeit. app.toTree() ist viel zu spät, um diese Operation durchzuführen, da alles bereits aufgebaut und eingerichtet wurde.

Glücklicherweise aktiviert ember-cli Addons, um die entsprechenden Bäume bei verschiedenen Lebenszyklus-Meilensteinen zu modifizieren.

Siehe: https://github.com/ember-cli/ember-cli/blob/master/ADDON_HOOKS.md für weitere Details, welche Haken derzeit verfügbar sind.

Der Haken, der den Trick tun sollte, ist Addon.prototype.postprocessTree. Jetzt haben wir zwei Möglichkeiten, wir können ein Standalone-Addon erstellen, über ember addon oder wir können ein leichtes In-Repo-Addon über ember g in-repo-addon erstellen. Normalerweise bevorzuge ich solche Repo-Addons, da sie kein zweites Projekt benötigen, aber ansonsten sind sie identisch.

  1. ember g in-Repo-Addon
  2. entfernen müssen wir Brokkoli-Eintopf über npm install --save broccoli-stew
  3. es var stew = require('broccoli-stew') gehören installieren;
  4. hook postprocessTree zum Add-on hinzufügen
  5. Wenn der postprocessTree für den Typ ist, der uns wichtig ist, verwenden Sie Brokkoli-Eintopf, um die Verzeichnisse zu entfernen, die uns nicht mehr interessieren.

Die resultierende Pull-Anforderung: https://github.com/WooDzu/ember-exclude-pod/pull/1

Hinweis: Ich bemerkte template in nachbearbeiten nicht einer der Typen verfügbar war, so fügte ich es: https://github.com/ember-cli/ember-cli/pull/4263 (soll einen Teil des nächsten glut-cli sein Release)

Hinweis: Wir wollen wirklich einen zusätzlichen Haken Addon.prototype.preprocessTree, um die Dateien zu ignorieren, bevor wir sogar bauen sie.Ich habe ein ähnliches Problem eröffnet: https://github.com/ember-cli/ember-cli/issues/4262

Ausgang der oben genannten Schritte

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; 
    } 
    } 

}; 
+0

In-Repo-Addon zusammen mit # 4263 tun den Trick. Sie Rock Mann – WooDzu

+0

ist es möglich, diese Schritte während der Tests nicht ausführen – BillPull

3

Ich bin ziemlich zuversichtlich Brokkoli-Eintopf rm wird dies richtig behandeln.

https://github.com/stefanpenner/broccoli-stew/blob/master/lib/rm.js#L4-L40 gibt es auch Tests, die ein sehr ähnliches Szenario testen: https://github.com/stefanpenner/broccoli-stew/blob/master/tests/rm-test.js#L48-L57

var stew = require('broccoli-stew'); 
module.exports = stew.rm(app.tree(), 'app/modules/{pod1,pod2}'); 

Wenn dies nicht funktioniert, können Sie ein Problem auf Brokkoli-Eintopf zu öffnen. Stellen Sie sicher, ein laufendes Beispiel zur Verfügung zu stellen, obwohl

+0

Hallo @Stefan . Bis jetzt keine Freude. Ich habe ein Repository erstellt, um das Problem zu reproduzieren, soll ich in Brokkoli-Eintopf oder Broccolli-Trichter berichten, der intern in stew.rm() verwendet wird? – WooDzu

+1

Sie sind richtig –

0

Das ist wirklich spät, aber ich erstellt eine Brokkoli-Plugin einfach, dies zu tun. Es ist verfügbar unter https://www.npmjs.com/package/broccoli-rm.

(Der Trick, ob ein ausgeschlossener Pfad ein Ordner zu erkennen ist, und dann ein Glob Spiel verwenden, um sicherzustellen, dass keines der Kinder des Ordners während des Kopierens symlinked erhalten.)

var rm = require('broccoli-rm'); 
var input = app.toTree(); 
module.exports = output = rm([input], { 
    paths: ['app/modules/pod1', 'app/modules/pod2'] 
}); 
+0

Willkommen bei Stack Overflow! Während dies theoretisch die Frage beantworten könnte, [wäre es vorzuziehen] (// meta.stackoverflow.com/q/8259), hier die wesentlichen Teile der Antwort aufzunehmen und den Link als Referenz bereitzustellen. – manetsus