web-dev-qa-db-ja.com

それぞれのファイルの親フォルダー名に基づいて、Gruntでファイルの名前を変更するにはどうすればよいですか?

私は次の構造を持っています:

src/
    modules/
        module1/
            js/
                main.js
            scss/
                main.scss
            index.html
        module2/
            js/
                main.js
            scss/
                main.scss
            index.html

単調なタスクを実行して、これらを次の構造にコピーしたいと思います。

dev/
    js/
        module1.js
        module2.js
    css/
        module1.css
        module2.css
    module1.html
    module2.html

既存のうなり声プラグインでこれを行う方法はありますか?そうでない場合、どうすればこれを達成できますか?

50
keirog

これは grunt-contrib-copy プラグインを使用して実行できます。

主な注意点は、名前変更機能(各ファイルの宛先とソースを取り込む)を使用して、プログラムで宛先を変更できることです。

これは(やや脆い)サンプルGruntfile.js目的の構造にコピーする必要があります。

module.exports = function(grunt) {
  // Project configuration.
  grunt.initConfig({
    copy: {
      main: {
        files: [
          {
            expand: true, 
            cwd: 'src/modules/', 
            src: ['**/*.js'], 
            dest: 'dev/js/', 
            rename: function(dest, src) {
              // use the source directory to create the file
              // example with your directory structure
              //   dest = 'dev/js/'
              //   src = 'module1/js/main.js'
              return dest + src.substring(0, src.indexOf('/')) + '.js';
            }
          },
          {
            expand: true, 
            cwd: 'src/modules/', 
            src: ['**/*.scss'], 
            dest: 'dev/css/', 
            rename: function(dest, src) {
              return dest + src.substring(0, src.indexOf('/')) + '.css';
            }
          },
          {
            expand: true, 
            cwd: 'src/modules/', 
            src: ['**/*.html'], 
            dest: 'dev/', 
            rename: function(dest, src) {
              return dest + src.substring(0, src.indexOf('/')) + '.html';
            }
          }
        ]
      }
    }
  });

  grunt.loadNpmTasks('grunt-contrib-copy');

  // Default task(s).
  grunt.registerTask('default', ['copy']);
};
85
Gloopy

このためだけにgrunt-contrib-copyを使用する必要はありません。ファイル拡張子を変更するか、出力ファイル名を返す関数を定義するオプションがあるgrunt.file.expandMappingを利用できます。

.jadeテンプレートを.htmlファイルにコンパイルするためのfilesタスク内のjadeオブジェクトの例を次に示します。

files: [{
    expand: true, 
    src: "**/*.jade", 
    dest: "<%= distDir %>", 
    cwd: "<%= assetsDir %>/jade", 
    rename: function(dest, matchedSrcPath, options) {
        // return the destination path and filename:
        return (dest + matchedSrcPath).replace('.jade', '.html');
    }
}]

この場合、renameオプションの代わりにext: '.html'オプションを使用する方が簡単でしたが、ここでrenameを使用しているので、どのように機能するかを確認できます。

grunt.file docsextおよびrename(およびその他の)オプションに関する詳細情報。いくつかの例 here および here

5
tobek

単純にオプションを使用できます:expand:true、flatten:true

カスタムの名前変更コールバックは不要です。

2
Paul0515

あなたの質問に対する正確な答えではありませんしかし、私はここで探していましたうなり声のある相対的な宛先フォルダそう...ここに私がそれを解決した方法があります

_...
base: {
  files:
  [
    {
      expand: true,
      cwd: 'app/design/frontend/',
      src: ['**/Magento_Sales/email-src/*.html'],
      dest: '../../Magento_Sales/email/',
      rename: function(dest, src, expand) {
        src = path.parse(src)
        return path.join(expand.cwd, src.dir, dest, src.base);
      }
    },
  ],
}
...
_

この小さなpath.join(expand.cwd, src.dir, dest, src.base);は、必要なパスを作成するだけです。

_expand.cwd = app/design/frontend/_

_src.dir = <DYNAMIC_FOLDERS>/Magento_Sales/email-src/_

_dest = ../../Magento_Sales/email/_

_src.base = <FILE>.html_

そして、すべて一緒に= _app/design/frontend/<COMPANY>/<MAIN-THEME>/Magento_Sales/email/<FILE>.html_

そして私の状況では、相対する宛先フォルダにHTMLメールをコンパイルします

0