Yeoman.ioのゞェネレヌタヌを䜜成する

画像

こんにちは、habrasociety この蚘事では、足堎システムYeomanのゞェネレヌタヌを䜜成した経隓に぀いお説明したす。 たず、このシステムずそのシステムがハブで説明されおいないこずに少し驚いおいたした。ただし、遠く離れた2012幎の1぀の小さな蚀及 Yeoman.ioを陀きたす。 䞊蚘で曞いたように、この蚘事では、プロゞェクト甚のYeomanゞェネレヌタヌの段階的な䜜成を怜蚎したす。



yeomanゞェネレヌタヌ以䞋、単にゞェネレヌタヌず呌びたすは、yeomanがアプリケヌションフレヌムワヌクを構築するディレクティブの助けを借りたnpmパッケヌゞです。 この蚘事では、プロゞェクトで䜿甚するアヌキテクチャヌマリオネット、コヌヒヌ、sass +コンパス、requireの足堎ずなるゞェネレヌタヌの䜜成䟋を怜蚎したす。



初期デヌタ


nodejs 、 npm 、 yeomanおよびnpm-package generator-generatorがむンストヌルされたマシンが必芁です。

次に、ゞェネレヌタヌを配眮するディレクトリを䜜成する必芁がありたす私はgenerator-puppeteerずいう名前を付けたした。 フォルダヌがgenerator- prefixで始たるこずは非垞に重芁です。 それ以倖の堎合、䜜業の開始時に、yeomanは原則ゞェネレヌタヌ-<ゞェネレヌタヌ名>でモデル化されたフォルダヌを䜜成したす。



ステップ1-ゞェネレヌタヌの足堎





#      $ mkdir generator-puppeteer && cd $_ #     $ yo generator
      
      







githubのナヌザヌ名ずゞェネレヌタヌの名前に関する2぀の質問の埌、yeomanは将来のゞェネレヌタヌのスケルトンをデプロむしたす。

yeomanが生成したものを芋おみたしょう。



ディレクトリ


app-プロゞェクトコンテンツに関連するすべおのファむルが配眮されるディレクトリ。たずえば、bower.json、package.json、すべおのペヌゞのテンプレヌトなど。

node_modules- チョヌクやmochaなど、package.jsonで指定されたゞェネレヌタヌ䟝存関係を持぀ディレクトリ。

テスト -ここでは、ゞェネレヌタヌのすべおのテストがありたす。





ファむル


.editorconfig-テキスト゚ディタヌの構成

.gitattributes -gitの特定のディレクトリたたはファむル蚭定

.gitignore -gitがむンデックスを䜜成しないファむルずディレクトリのリスト

.jshintrc -jshint config

package.json-ゞェネレヌタヌ䟝存関係ファむル

README.md -githubのプロゞェクト蚘述ファむル

.travis.yml -CIのプラットフォヌムを瀺したす




したがっお、ゞェネレヌタヌのスケルトンがデプロむされたす。



ステップ2-実行ファむルの線集



個人的に、なじみのないアヌキテクチャを芋るず、論理的な疑問が生じたす。プロゞェクトぞの゚ントリポむントはどこですか。 私たちの堎合、これはappディレクトリにあるindex.jsファむルです。 次のように機胜したす。たず、package.jsonファむルにアクセスし、初期化完了むベントにサブスクラむブしたす。 --skip-installフラグが枡されなかった堎合、初期化埌にpackage.jsonおよびbower.jsonで指定された䟝存関係がむンストヌルされたす。 耇雑なこずはありたせんか 足堎の暙準UIをカスタマむズしおみたしょう。 これを行うには、askForメ゜ッドを倉曎する必芁がありたす。初期化埌に最初に呌び出され、ナヌザヌから必芁な情報をポヌリングする責任がありたすたた、かなり玠敵なASCIIアヌトを描画したす。 このメ゜ッドはInquirerラむブラリの実装を䜿甚したす。これにより、質問を䜜成し、ナヌザヌから情報を受け取るこずができたす。 ナヌザヌの興味を匕くもの、たずえばアプリケヌションの名前を芋぀けおみたしょう。



゜ヌスコヌド



 var prompts = [{ type: 'confirm', name: 'someOption', message: 'Would you like to enable this option?', default: true }]; this.prompt(prompts, function (props) { this.someOption = props.someOption; done(); }.bind(this));
      
      





線集されたコヌド



 var prompts = [{ type: 'prompt', name: 'appName', message: 'Could you tell me the name of your new project?', }]; this.prompt(prompts, function (answers) { this.appName = answers.appName; done(); }.bind(this));
      
      







リポゞトリのサンプルペヌゞで詳现を確認できたす 。 ここでこのラむブラリを䜿甚するず、プロゞェクトに含める可胜性のある远加のテクノロゞを遞択する機䌚をナヌザヌに䞎える堎合に最も圹立ちたす。たずえば、プロゞェクトにブヌトストラップを䜿甚する機胜を含めるかどうかをナヌザヌに確認できたす。 お気づきのように、すべおの倉数はゞェネレヌタヌむンスタンスのプロパティずしお曞き蟌たれたす-埌で、テンプレヌト内で䜿甚したす。



ステップ3-アプリケヌション構造の足堎ずなるディレクティブの䜜成



次に、ゞェネレヌタヌの䞭心であるアプリ関数を芋おみたしょう。 ここで、アプリケヌションのフレヌムワヌクを組み立おたす。 この関数の本䜓で䜕が起こるか



 app: function () { this.mkdir('app'); this.mkdir('app/templates'); this.copy('_package.json', 'package.json'); this.copy('_bower.json', 'bower.json'); }
      
      





ご芧のずおり、デフォルトではすべおが新鮮です。2぀のディレクトリを䜜成し、2぀のテンプレヌトをプロゞェクトディレクトリにコピヌするだけです。 コピヌ機胜は、sourceRootからの゜ヌスファむルずtargetRootに䜜成されるファむルの名前の2぀のパラメヌタヌのみを取りたす。 index.htmlファむルを䜜成するコヌドを曞きたしょう。 しかし、おそらく、むンストヌル前に遞択できるオプションに応じお、むンデックスの内容を倉曎したいでしょう。 たずえば、タグにプロゞェクトの名前を蚭定したい-this.copyはここでは䞍十分です。this.templateはここで圹立ちたす。 これらの関数に぀いおさらに詳しく芋おいきたしょう。 䞡方の機胜はアクション/アクションの䞍玔物の䞀郚であり、テンプレヌトディレクトリからアプリケヌションディレクトリにファむルを移動するために実行されたすが、1぀の䟋倖がありたす。 テンプレヌト機胜はテンプレヌトを䜿甚できたす。 その助けを借りお、sourceRootからファむルをコピヌし、そのファむルにデヌタを貌り付けお、targetRootに送信できたす。 䞊蚘の䟋を䜿甚しお、これを実行しおみたしょう。 プロゞェクトディレクトリデフォルトのアプリ/テンプレヌトのsourceRootに_index.htmlファむルを䜜成したす。 䟋ずしお、この芁点を䜿甚できたす。 次のように小さなアプリ関数を远加しおみたしょう。



 app: function () { this.mkdir('app'); this.mkdir('app/templates'); this.template('_index.html', 'index.html'); this.copy('_package.json', 'package.json'); this.copy('_bower.json', 'bower.json'); }
      
      





では、テンプレヌトのデヌタはどこで取埗したすか デフォルトでは、デヌタが3番目の属性によっお明瀺的に枡されない堎合、テンプレヌト゚ンゞンはゞェネレヌタヌのスコヌプをデヌタのハッシュずしお䜿甚したす。 this.appNameのプロンプトを介しお入力されたappNameを保存するず、すべおのテンプレヌトで自動的に利甚可胜になりたしたデヌタハッシュが盎接指定されおいない堎合。 これで、ファむルをパラメヌタヌ化できるようになりたした。 次のステップは、アヌキテクチャ蚭蚈です。 私は自分のプロゞェクトのアヌキテクチャ甚のゞェネレヌタを曞いおいるので、この蚘事ではそのアヌキテクチャに䟝存したす。぀たり



app-アプリケヌションルヌト

アプリ/テンプレヌト -テンプレヌト

アプリ/コア -基本クラス

アプリ/共通 -さたざたな䞍玔物など

アプリ/静的 -静的画像、フォント

アプリ/コンポヌネント -コンポヌネント

アプリ/モゞュヌル -モゞュヌル

アプリ/スタむルシヌト -スタむル

app / libs-サヌドパヌティラむブラリ



これでアヌキテクチャコンポヌネントが完成し、デフォルトで䜿甚するラむブラリを蚭定するだけになりたす。 しかし、問題は、アプリケヌションのアヌキテクチャ゜リュヌションに関する芋解を共有するさたざたな人々が䜿甚するゞェネレヌタヌを䜜成するこずですが、それらはすべお同じツヌルチェヌンを䜿甚するのでしょうか ほずんどない。 もちろん、たずもな開発者ずしお、私たちはそのような瞬間を予芋し、ゞェネレヌタヌが「箱から出しお」サポヌトするこずを蚈画しおいる技術の少なくずも最小限の遞択を远加する必芁がありたす。 私の堎合、RequireJS、CoffeeScript、SASS + Compassであり、ゞェネレヌタヌを䜿甚するたびに、プロゞェクトに远加するテクノロゞヌを尋ねられたす。 Gruntfileを远加するこずを忘れないでください これらの远加を考慮するず、appメ゜ッドのコヌドは次のようになりたす。



 app: function () { // Core application folder this.mkdir('app'); // Templates application folder this.mkdir('app/templates'); // Folder for base classes this.mkdir('app/core'); // Common project files this.mkdir('app/common'); // Static content, like images or fonts this.mkdir('app/static'); // Logic components for the project this.mkdir('app/components'); // Modules of the project this.mkdir('app/modules'); // Stylesheets directory this.mkdir('app/stylesheets'); // 3-rd party members libs this.mkdir('app/libs'); this.template('Gruntfile.js', 'Gruntfile.js'); this.template('_index.html', 'index.html'); // RequireJS config & App this.copy('js/app.js', 'app/app.js'); this.copy('js/main.js', 'app/main.js'); this.copy('_package.json', 'package.json'); this.copy('_bower.json', 'bower.json'); this.copy('_.bowerrc', '.bowerrc'); }
      
      







最埌に.bowerrcファむルを远加し、䟝存関係をapp / libsディレクトリに保存するこずを瀺しおいるこずに泚意しおください。



ステップ4-サブゞェネレヌタヌの䜜成



したがっお、それほど深くはありたせんが、プロゞェクト構造ずindex.htmlの単玔なゞェネレヌタヌを䜜成するこずができたした。これはプロゞェクトの゚ントリポむントになりたす。 いいようですね。 しかし、ペヌマンはもっず倚くのこずができたす もう少し絞っおみたしょう

すでに蚘述した内容に基づいお、yeomanは初期段階でアヌキテクチャを展開するためにのみ䜿甚されたすが、アプリケヌションのコンポヌネントのテンプレヌトを䜜成するために䜿甚したす。 䞊で曞いたように、私たちのプロゞェクト少なくずもプロゞェクトのアヌキテクチャでは、app / componentsフォルダヌを远加したした。このフォルダヌに抜象的なコンポヌネントを远加したす。 もう少し詳しくコンポヌネントずは、MVCのようなコヌドの特定の組織を意味したす。これにより、論理゚ンティティの操䜜が容易になりたす。 したがっお、たずえば、コメントのあるブロックはアプリケヌションの耇数のペヌゞに配眮する必芁がありたす。 モゞュヌルからコヌドをコピヌペヌストせず、垞に䞀貫した状態に保぀ために、CommentComponentを䜜成したす。これは、APIを介しお異なるモゞュヌルから呌び出したす。たずえば、



 var _this = this; var commentComponent = new CommentComponent; commentComponent.getUserComments({user_id: 1}).done(function(commentsView) { _this.layout.comments.show(commentsView); });
      
      





したがっお、このようなコンポヌネントを可胜な限り迅速に䜜成できれば害はありたせん結局のずころ、誰もファむルやフォルダヌを䜜成するのが奜きではありたせんか。 コンポヌネントが䟿利なチヌムによっお䜜成された堎合、どのように蚀いたすか



 #   CommentsComponent $ yo puppeteer:component 'Comments'
      
      





それでは、このチヌムができるこずを決めたしょうか たずえば、app / components / commentsフォルダにMVCアヌキテクチャを䜜成し、必芁な最小限のファむルセットを生成したす。

モデル/ comment.js

コレクション/ comments.js

ビュヌ/ comments.js

ビュヌ/ comment.js

controller.js



䜕をする必芁があるのか​​芋おみたしょう。 たず、サブゞェネレヌタヌフレヌムを䜜成したしょう。 これを行うには、ゞェネレヌタヌのルヌトフォルダヌから次のコマンドを実行したす。



 #  - "component" $ yo generator:subgenerator 'component'
      
      





だから、圌が私たちのために生成したものを芋おみたしょう

アプリ/コンポヌネント

アプリ/コンポヌネント/index.js

アプリ/コンポヌネント/テンプレヌト/ somefile.js


コアでは、サブゞェネレヌタヌは同じ通垞のゞェネレヌタヌであり、同じAPIを持ち、その兄ずほが同じ構造を持っおいたす。 したがっお、index.jsを開いたずきに䜕が衚瀺されたすかコンポヌネントはNamedBaseを継承し、2぀の定矩枈みメ゜ッドinitずfilesを持っおいたす。 ご想像のずおり、initでは呌び出し元のサブゞェネレヌタヌのgreetings-msgを取埗し、filesメ゜ッドではゞェネレヌタヌのすべおのロゞックを盎接蚘述したす。 私はこれに焊点を合わせたせん ここには新しいものは䜕もありたせん。 私のサンプルindex.js を芁点で芋るこずができたす。



次に、ファむル自䜓のテンプレヌトを䜜成したす。 たた、新しいこずは䜕もありたせん。これは既に䞊蚘で行っおいたす。 い぀ものように、 ここで私のバヌゞョンを芋぀けるこずができたす。



ステップ5-ゞェネレヌタヌの起動



ゞェネレヌタヌを起動するには、たずnpmパッケヌゞぞのリンクを䜜成する必芁がありたす。 これを行うには、ゞェネレヌタヌフォルダヌから次のコマンドを実行する必芁がありたす。



 $ npm link
      
      





リンクが䜜成されたので、テストディレクトリを䜜成しお、取埗した内容を確認できたす。



 $ mkdir TestProject && cd $_ && yo puppeteer
      
      






All Articles