2014-07-19 4 views
15

Ich bin ein Yeoman Generator für eine ziemlich typische Knoten App Aufbau:Was ist die empfohlene Art, mehrere dotfiles mit yeoman zu kopieren?

/ 
|--package.json 
|--.gitignore 
|--.travis.yml 
|--README.md 
|--app/ 
    |--index.js 
    |--models 
    |--views 
    |--controllers 

im Ordner Vorlagen meines Yeoman Generator, muss ich die dotfiles umbenennen (und die package.json), um sie daran zu hindern, in Bearbeitung als Teil des Generators:

templates/ 
|--_package.json 
|--_gitignore 
|--_travis.yml 
|--README.md 
|--app/ 
    |--index.js 
    |--models 
    |--views 
    |--controllers 

ich sehe eine Menge von Generatoren, die dotfiles einzeln manuell kopieren:

this.copy('_package.json', 'package.json') 
this.copy('_gitignore', '.gitignore') 
this.copy('_gitattributes', '.gitattributes') 

I denke, es ist ein Schmerz, meinen Generatorcode manuell zu ändern, wenn ich neue Vorlagendateien hinzufüge. Ich möchte automatisch alle Dateien im Ordner/templates kopieren und die Namen mit dem Präfix _ umbenennen.

Was ist der beste Weg, dies zu tun?

Wenn ich meine Absicht, in imaginären regex zu beschreiben, ist es das, was es aussehen würde:

this.copy(/^_(.*)/, '.$1') 
ths.copy(/^[^_]/) 

EDIT Dies ist die beste kann ich verwalten:

this.expandFiles('**', { cwd: this.sourceRoot() }).map(function() { 
    this.copy file, file.replace(/^_/, '.') 
}, this); 

Antwort

25

I Ich habe diese Frage über Google gefunden, als ich nach der Lösung gesucht habe, und dann habe ich es selbst herausgefunden.

die neuen fs API verwenden, können Sie Klackse verwenden!

// Copy all non-dotfiles 
    this.fs.copy(
    this.templatePath('static/**/*'), 
    this.destinationRoot() 
); 

    // Copy all dotfiles 
    this.fs.copy(
    this.templatePath('static/.*'), 
    this.destinationRoot() 
); 
+0

Auch erwähnenswert, dass, wenn Sie eine glod in vom Ziel verwenden, ein Verzeichnis sein muss. – Swordfish0321

+0

Dies war die richtige Antwort und verdient es, aufgefrischt zu werden. Siehe mein letztes Commit für ein Anwendungsbeispiel: https://github.com/srsgores/generator-stylus-boilerplate/commit/d785cfe31e3a519edb3b75edb22a5dbc776ecdfd – user1429980

+0

Danke! Außerdem kann this.destinationRoot() durch this.destinationPath ("path/to/folder") für relative Ziele ersetzt werden (wie in srsgores Commit-Beispiel angegeben). –

12

zu @callumacrae ‚s Antwort Hinzufügen: Sie auch dot: true im globOptions von copy() definieren können. Auf diese Weise enthält ein /** Glob dotfiles. Beispiel:

this.fs.copy(
    this.templatePath('files/**'), 
    this.destinationPath('client'), 
    { globOptions: { dot: true } } 
); 

Eine Liste der verfügbaren Glob Optionen können im README von node-glob finden.

+1

Yeoman Dokumentation ist wirklich schlecht. Wo haben Sie die Informationen zu "globOptions" gefunden? Ich kenne die Liste der Optionen, jedoch gibt es keinen Hinweis auf den Namen des Basisobjekts "globOptions". – dude

+0

@julmot I _think_ Ich habe es schließlich nach dem ** File Utilities ** Abschnitt in den [File System Docs] (http://yeoman.io/authoring/file-system.html) gefunden. Sie verlinken auf das 'mem-fs-editor' npm-Paket, das die zugrunde liegende Implementierung für die Dateisystemoperationen bereitstellt. In dieser README gibt es mehrere Erwähnungen von 'globOptions' (die wiederum zum' node-glob' Paket führen :-), das auch aus den [API Docs für 'actions/file'] verlinkt ist (http: // yeoman .io/generator/actions_file.html)) – sthzg

+1

Ich hatte auch Probleme mit der Punktdatei, aber mit fs.copyTpl, die intern fs.copy verwendet. Aber anscheinend akzeptiert fs.copyTpl keine globOptions wie Kopieren. Um diese Situation zu überwinden, gibt es eine Lösung: this.fs.copyTpl (glob.sync ('files/**', {dot: true}), 'client', Kontext). –

0

Wenn Sie Vorlagen nicht verwenden möchten, die mit einem Punkt beginnt, können Sie das dive Modul verwenden, um etwas identisch zu erreichen:

für dotfiles
var templatePath = this.templatePath('static-dotfiles'); 
var destinationRoot = this.destinationRoot(); 
dive(templatePath, {all: true}, function (err, file, stat) { 
    if (err) throw err; 
    this.fs.copy(
      file, 
      (destinationRoot + path.sep + path.relative(templatePath, file)) 
        .replace(path.sep + '_', path.sep + '.') 
    ); 
}.bind(this)); 

wo static-dotfiles ist der Name der Vorlage Ordner, in dem _ ersetzt . in Dateinamen (zB: _gitignore).

Vergessen Sie nicht, eine Anforderung an dive an der Spitze des Generators mit

var dive = require('dive'); 

Natürlich funktioniert das auch für copyTpl hinzuzufügen.

Beachten Sie, dass alle Unterpunkte von Pfaden, die mit einem _ beginnt wird von einem . ersetzt werden (zB: static-dotfiles/_config/_gitignore wird als .config/.gitignore erzeugt werden)

0

Gerade habe diese Arbeit für mich: die globOptions muss im vierten sein Argument:

this.fs.copyTpl(
    this.templatePath('sometemplate/**/*'), 
    this.destinationPath(this.destinationRoot()), { ...template args }, 
    undefined, 
    { globOptions: { dot: true } } 
); 
+0

erklären Sie den Downvote? Dies ist die aktuelle Arbeitsversion. –

+0

Das ist besser. Bevorzugen Sie dies. – kgpdeveloper

Verwandte Themen