私はかなり典型的なノードアプリ用の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);
解決策を探していたときにGoogleでこの質問を見つけ、自分で理解しました。
新しいfs
APIを使用すると、グロブを使用できます。
// Copy all non-dotfiles
this.fs.copy(
this.templatePath('static/**/*'),
this.destinationRoot()
);
// Copy all dotfiles
this.fs.copy(
this.templatePath('static/.*'),
this.destinationRoot()
);
@callumacraeの答えに追加:copy()
のglobOptions
でdot: true
を定義することもできます。そうすれば、/**
globはincludeドットファイルになります。例:
this.fs.copy(
this.templatePath('files/**'),
this.destinationPath('client'),
{ globOptions: { dot: true } }
);
使用可能なGlobオプションのリストは、node-glob
の- [〜#〜] readme [〜#〜] にあります。
これがうまく機能しました:globOptionsはfifth引数にある必要があります:
this.fs.copyTpl(
this.templatePath('sometemplate/**/*'),
this.destinationPath(this.destinationRoot()),
null,
null,
{ globOptions: { dot: true } }
);
ドットで始まるテンプレートを使用したくない場合は、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
として生成されます)