2016-08-10 7 views
1

gruntfile DRYを維持するために、私は環境に基づいてオプションを変更したいと思います。私はそれらの両方が、しかし、異なるオプションで、同じファイルをコンパイルしたいタスクのgrunt環境固有のオプション

grunt.task.run('uglify:production'); 
grunt.task.run('uglify:development'); 

だから例えば私は2つのイサキタスクを使用する場合。

uglify: { 

    production: { 
    options: { 
     compress: true 
    } 
    } 

    development: { 
    options: { 
     compress: false, 
     beautify: true 
    } 
    } 

    // rather not redeclare these files twice 
    files: { 

    vendor: { 
     // this name should change based on the environment 
     'dest/vendor-output.js': ['src/vendor-input1.js', 'src/vendor-input2.js'] 
    }, 
    custom: { 
     'dest/custom-output.js': ['src/custominput1.js', 'src/custominput2.js'] 
    } 

} 

生産はさえも、より理想的であるカスタムoutput.min.jsに先の名前を持つことができれば。

if-else文を試しましたが、飛行していないgruntタスク定義内で試しました。

答えて

1

grunt configはちょうどjsonなので、gruntテンプレートを使用して、あなたのファイルをconfigのプロパティとして持つことができます。

uglifyFiles: { 

    vendor: { 
    // this name should change based on the environment 
    'dest/vendor-output.js': ['src/vendor-input1.js', 'src/vendor-input2.js'] 
    }, 
    custom: { 
    'dest/custom-output.js': ['src/custominput1.js', 'src/custominput2.js'] 
    } 
}, 
uglify: { 

    production: { 
    options: { 
     compress: true 
    }, 
    files: '<%= uglifyFiles %>' 
    }, 

    development: { 
    options: { 
     compress: false, 
     beautify: true 
    }, 
    files: '<%= uglifyFiles %>' 
    } 
} 

http://gruntjs.com/configuring-tasks#templates

申し訳ありませんが、私はかなり

If production could even have the destination name to custom-output.min.js that would be even more ideal.

はあなたが少しより多くの情報を与えることができる、この質問を理解していなかった、またはあなたがどこ達成しようとするものの上にありますか?

EDIT

あなたが実際にそれぞれわずかに異なるコードをしたいとあなたが何をしようとしていることはDRYのうち、繰り返し部分を取るように思えます。これはjsonではできませんが、jsを使用してブラケット表記を使用して、宛先をキーとして作成する必要があります。私はずっと簡単な方法だと思っています。そして、これのために何か不快感を覚えるのかは、以下のことをすることです。

vendorUglifyFiles: ['src/vendor-input1.js', 'src/vendor-input2.js'], 
customUglifyFiles: ['src/custominput1.js', 'src/custominput2.js'], 
uglify: { 

    production: { 
    options: { 
     compress: true 
    }, 
    files: { 
     vendor: { 
     'dest/vendor.min.js': '<%= vendorUglifyFiles %>' 
     }, 
     custom: { 
     'dest/custom.min.js': '<%= customUglifyFiles %>' 
     } 
    } 
    }, 

    development: { 
    options: { 
     compress: false, 
     beautify: true 
    }, 
    files: { 
     vendor: { 
     'dest/vendor.js': '<%= vendorUglifyFiles %>' 
     }, 
     custom: { 
     'dest/custom.js': '<%= customUglifyFiles %>' 
     } 
    } 
    } 
} 

編集:

vendorUglifyFiles: ['src/vendor-input1.js', 'src/vendor-input2.js'], 
customUglifyFiles: ['src/custominput1.js', 'src/custominput2.js'], 
uglify: { 

    production: { 
    options: { 
     compress: true 
    }, 
    files: { 
     'dest/vendor.min.js': '<%= vendorUglifyFiles %>', 
     'dest/custom.min.js': '<%= customUglifyFiles %>' 
    } 
    }, 

    development: { 
    options: { 
     compress: false, 
     beautify: true 
    }, 
    files: { 
     'dest/vendor.js': '<%= vendorUglifyFiles %>', 
     'dest/custom.js': '<%= customUglifyFiles %>' 
    } 
    } 
} 

トリックを行います:2016年11月8日、夜03時12分

はindexOfのエラーをスローレベルを削除しました。

+0

私はどちらかにコンパイルするタスクを得ようとしています。縮小された生産バージョンまたは通常の美化された開発バージョンのファイルを含む。あなたが書いた例は最初の部分のために働く。現在のところ、ファイル名は、開発用のvendor.jsまたは実動バージョン用のvender.min.jsのいずれかにする必要があります。 – Remi

+1

'production'タスクの下に' vendor'と 'custom'をネストすると' Warning:pattern.indexOf is not function'エラーが発生したようです。その余分なレベルを削除することはそのトリックです。 – Remi

+0

ああ申し訳ありませんが、メモリを入力して、修正していただきありがとうございます。 –

0

GruntはJavascriptなので、IF/ELSE文を実際に追加することができます。

例:あなたは、ベンダーおよび/または放出に対処する方法、それは今unknowですので

files: { 
    (() => { 
     if (grunt.option('vendor')) { 
      return { 
       'dest/vendor-output.js': ['src/vendor-input1.js', 'src/vendor-input2.js'] 
      } 
     } else (grunt.option('release')) { 
      return { 
       'dest/custom-output.js': ['src/custominput1.js', 'src/custominput2.js'] 
      } 
     } 
    }()) 
} 

/*** 
* OR SOMETHING LIKE 
**/ 

files: { 
    (() => { 
     switch(grunt.option) { 
      case 'vendor': 
       return { 
        'dest/vendor-output.js': ['src/vendor-input1.js', 'src/vendor-input2.js'] 
       }; 
       break; 
      case 'release: 
       return { 
        'dest/custom-output.js': ['src/custominput1.js', 'src/custominput2.js'] 
       }; 
       break; 
      default: 
       return {}; 
     } 
    } 
} 

はもちろん、あなたの希望状況にこれを変更する必要があります。

+0

粗いタスク 'uglify:production'または' uglify:development'に基づいて、この条件で生産と開発のオプションを捕らえるべきではありませんか? – Remi

+0

これも可能です。 'grunt uglify --type = production'のような変数を設定して、' grunt.option( 'type')// = production'を使ってそれを集めることもできます。 –

関連する問題