web-dev-qa-db-ja.com

ヨーマンで複数のドットファイルをコピーするための推奨される方法は何ですか?

私はかなり典型的なノードアプリ用のyeomanジェネレーターを構築しています:

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

Yeomanジェネレーターのtemplatesフォルダーで、ドットファイル(およびpackage.json)の名前を変更して、ジェネレーターの一部として処理されないようにする必要があります。

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

ドットファイルを個別に手動でコピーするジェネレーターがたくさんあります。

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

新しいテンプレートファイルを追加するときに、ジェネレーターコードを手動で変更するのは面倒だと思います。/templatesフォルダー内のすべてのファイルを自動的にコピーし、接頭辞が_のファイルの名前を変更したいと思います。

これを行うための最良の方法は何ですか?

私の意図を架空の正規表現で説明すると、次のようになります。

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

[〜#〜] edit [〜#〜]これは私が管理できる最高のものです:

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

解決策を探していたときにGoogleでこの質問を見つけ、自分で理解しました。

新しいfs AP​​Iを使用すると、グロブを使用できます。

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

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

@callumacraeの答えに追加:copy()globOptionsdot: trueを定義することもできます。そうすれば、/** globはincludeドットファイルになります。例:

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

使用可能なGlobオプションのリストは、node-globの-​​ [〜#〜] readme [〜#〜] にあります。

26
sthzg

これがうまく機能しました:globOptionsはfifth引数にある必要があります:

this.fs.copyTpl(
  this.templatePath('sometemplate/**/*'),
  this.destinationPath(this.destinationRoot()),
  null,
  null,
  { globOptions: { dot: true } }
);
10
Daniel Patrick

ドットで始まるテンプレートを使用したくない場合は、diveモジュールを使用して同じことを実現できます。

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

ここで、static-dotfilesは、ドットファイルのテンプレートフォルダの名前です。_は、ファイル名の.を置き換えます(例:_gitignore)。

ジェネレーターの上部にあるdiveに要件を追加することを忘れないでください。

var dive = require('dive');

もちろん、これはcopyTplでも機能します。

_で始まるパスのすべてのサブパートは.に置き換えられることに注意してください(例:static-dotfiles/_config/_gitignore.config/.gitignoreとして生成されます)

0
mperrin