jhipsterのテンプレート改造準備
の編集
Top
/ jhipsterのテンプレート改造準備
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
10の質問
ABC予想
AI
AI API
AI プロンプト
AIでつかわれているtransformerのまとめ
AIの話題
ANTLR
ANTLR v3 FAQ よくある質問
ANTLR 独学
ANTLR4 独学
ANTLRでOracleのDDLを解析してみる
ANTLRチュートリアル
AOP
API
ARMマイコン基盤
ATOM SHELL理論
Access VBAメモ
Access-Control-Allow-Origin
AndroidとTensorflow
Android開発
Android開発 入門
AngularJS
Anko
Apache Bench
ArchUnitを学ぶ
Axiosとは
Axis2
BI Publisherで始めるデータ駆動型レポート作成
BPMNの勉強
BackTrack4
Blog from iPhone
Bootstrapとは
BracketName
C3 AI Applications
C3 AI エクスマキナ
CSS備忘録
CentOS
ChatGPTの話題
Chevrotainのパーサメソッド
Chevrotain一覧
Chromeエクステンション
Cocoa Touch Static Library
CoffeeScript
Confluent Control Centerやってみる
C言語でオブジェクト志向な記述方法
DDD ドメイン駆動設計
DDL生成ツール
DJUnit
DMM.comのAPIとか
DOSコマンドメモ
Dashcode
DeepFloyd IF
Dockerが動かない場合の対処
ES2015
Eclipse Monkey
Eclipse Plugin
Eclipseの色設定
Eclipse使いがXCode使い初めて知りたいこと
ElasticMQメモ
Elixir
Emmet
Erlangメモ
ExcelファイルをAIに読ませる
Exceptionを見やすく
Expression Tree
FLEX
FLEX リフレクション
Fisheye
FlashやJavascriptを使った演出
FormattingRules
FrontPage
GAE
GAE Data Store API
GENERAL SQL PARSER JAVA を試してみる
GLOBAL
GPT4ALL
GQL
GUIからMacPortsを管理するアプリケーション - Porticus
Generative Adversarial Networks
Gin JavaScriptで構文解析
Git Blame
GitHubアクションを使ったトロイの木馬のまとめ
GitLab
GitLabRunnerを増やす
GitLabでPlantUML使ってみる
GitLabでプロジェクト管理する
GitLabの機能をそのまま使って認証システム作ったらどこまでできる?
GitLabサーバインストールとメンテ注意事項
GitとAntとSpringとJUnit
Google Cloud Platform
Googleの裏技
Google認定プロジェクトマネージャの勉強メモ
Grails
GraphQL
HTM 階層型時間メモリ
HTML スクレイピング
HTML パース
HTML5
HTML5 Canvas
Hadoop
Help
If Then Maybe プログラミング
Inkscape script
InterWiki
InterWikiName
InterWikiSandBox
JAVAの記事一覧
JBoss
JDBC テーブル一覧を得る
JDBC カラム一覧を得る
JDT eclipse
JGRIB
JHIPSTER JDL
JHIPSTER OpenAPI
JHIPSTER エンティティをフィルタリングする
JHIPSTER6.1.2
JHIPSTERでスマホサイト
JHIPSTERのBLUEPRINTを作る
JHIPSTER一覧
JHipster
JHipster API FirstDepelop
JHipster エンティティを更新する
JHipster7をつかってみる
JHipsterでBuleprintを使いこなす
JHipsterのコード生成を改造
JHipsterのプロジェクトをGitLabでCI/CDする
JHipsterのプロジェクトをデプロイする
JMeter
JOOQとは
JSFとStruts
JSqlParser
Java Closure
Java Compiler API
Java Function
Java SQL Parserを調査する
Java Spring AOP
Java Spriteを設計してみる
Java オブジェクトのダンプ
Java ドラックできる曲線
Java 備忘録
Java 文字化け
Java11以降のJRE
Java7サンプルコード
JavaFx
JavaScriptでパーサを作る Chevrotain
Javaasist 動的にクラスを編集
Javascript グラフィックライブラリ
Javascript コーディングパターン
Javascript界隈
Javassist
JavaでSVG
Javaで関数型で引数をとる
JavaのジェネリクスTip
Javaのラムダ式
Javaの有名なライブラリ紹介
Javaは、IDEのテンプレートを使いこなせばいいよ
Javaプログラマ向けモナド
Javaメモリリーク
Jenkins
Jenkins(Hudson)メモ
Jestとは
Jhipsterマイグレーション
Json Yaml Xml Hash Scala
Kafka REST Proxy さわってみる
Kotolin
LDAPサーバをdockerで立ち上げる
Linux メモ
LiquiBaseとは
Lombok
MDBをコンパクトにするVBA
MQL5 小作品
MT4
MT5 EA
MYSQL
MacTool
Macにしゃべらせる
Mac用のメモ
Mattermostを使ってオンプレミスでチャット環境を作る
Maven
Mementoパターン
MenuBar
NILScript
NetBeanでプロファイル
Network Service Desk Engineer
Node-RED
Node-Red
NumPy
OQL オブジェクト問い合わせ言語
OSコマンドインジェクション
ObjctiveC サウンド
ObjectMapperの備忘録
ObjectiveC NSString
ObjectiveC サーバ
ObjectiveC ターミナル用コマンドを作る
ObjectiveC バックグラウンド
ObjectiveC ワーニング
Oculusアプリの開発
OpenFeint
OpenOffice
OpenResty
Outlook VBA
PHP
POSTGRESQL
Pandas Python Data Analysis Library
PdfBox Java用PDFライブラリ
Plagger
PukiWiki
PukiWiki/1.4
PukiWiki/1.4/Manual
PukiWiki/1.4/Manual/Plugin
PukiWiki/1.4/Manual/Plugin/A-D
PukiWiki/1.4/Manual/Plugin/E-G
PukiWiki/1.4/Manual/Plugin/H-K
PukiWiki/1.4/Manual/Plugin/L-N
PukiWiki/1.4/Manual/Plugin/O-R
PukiWiki/1.4/Manual/Plugin/S-U
PukiWiki/1.4/Manual/Plugin/V-Z
PyHipster
QuartzCore
RAD
REST
RWKV
Rails3
Railsと差分開発についての考察
React.js
React.js モーダル画面
RecentDeleted
RedmineLE
Redshift
Relumeでサイトの骨格を作る
Require.js
Rubycocoa
RubyでScalaをコンパイルするツールをつくる
Rubyアソシエーション認定証
Ruby入門
SCALA REPL
SCALA support tool
SCALAの記事一覧
SELinux
SEO
SEO Yahoo対策
SEO対策一覧
SPAM対策
SQLite
SSH
SVNをJavaで操作
SakuraZencoding
SandBox
Scala / Hadoop
Scala Process exec
Scala 遅延評価
Scala/LiftでSlim3
ScalaSigParser
ScalaWithExcel
Scala チュートリアル
Scalaで3D
ScalaでLisp
ScalaとGroovyのPOJO比較
ScalaのIDEについて
Scala言語を学ぶやさしいツール「Kojo」
Slack API やってみる
SocketAppender
Spring
Spring bootでのテストのTIPS
SpringBootのSTSの新規プロジェクトでるエラーの対応
SpringSecurity SAML
Sqlite
Squirrel
StringTemplate
Stringクラス拡張
TALEND
ThreadLocal
Todo一覧
Trac Lightning
Twitter
UltraEdit
Unityでシューティングゲーム作る際のメモ
VBAでREST通信
VBAのコード
VBAをOpenOffice.org Basicにする
VBAをOpenOffice.org+Basicにする
VPN構築の勉強メモ
VPSやIaaSメモ
VSCodeでRuby開発
VSCodeメモ
VSCode用ChatGptのPlugin
VSCode設定
VirtualBox On Mac
Visual Studio Code プラグイン開発
Vuexとは
WBS管理の弊害
WIN32API
WSDL
Watson
WebDesign探訪
WebLogic フィルタ
WikiEngines
WikiName
WikiWikiWeb
Windows10のPowerShell でキーボードの言語切り替え
WindowsTool
Worker Thread パターン
XBee
XDOCLET
XForms
XPath
XSL
YahooPIPES
Yahooインフォセンター
Yet Another Pragger
YouTuber
YukiWiki
anacondaをcygwinで使う
ansible
antlr snippet
antlr 再入門
antlrと日本語
autoit
automator
bluemix
bootstrap2
bower
ccze Colorize log files on CentOS and Ubuntu using ccze tool
centos7
cglibを使って動的コード生成
cocos2d
cygwin
diff
dockerのローカルイメージをDocker-in-Dockerで参照する
eclipse設定
emacs 備忘録
emacs 文字列置換
emacsをviライクにする
excel tips
excelのdiff
expectで自動化
figmaにプラグインをインストールする
ftp自動化
gemini
generator-jhipster-gql
git diffを使った構成管理の省力化
goをやってみる
grizzly
gulp
homebrew
iPhone Bluetoothプログラミング
iPhone iAd
iPhone 実機テスト手続き
iPhoneでグラフィックのHellowWorld
iPhoneとGmailメール
iPhoneに実機転送
iPhoneプログラミング
iPhoneプログラミング/ビューを理解すればiPhoneアプリの基礎を押さえられる
iPhoneプログラミング一覧
iPhoneプログラミング入門
iPhone開発/Interface Builder Plug-in
iPhone開発/キャプチャの取り方
intra-mart
jQuery.Flickableのメモ
java spring boot 認証 memo
jersey
jhipster-codeにアノテーション追加してみる
jhipsterのテンプレート改造準備
jparsecドキュメント日本語訳
jparsec入門
kafkaの勉強
log4j2の脆弱性
mac diff
mailcowのインストール
memcached
minecraft マイクラ あるきながら、高速ダンジョン作成
mqttの勉強
nginx_lua
nginxのメモ
node_moduleをnpm linkを使って自分用にする
npm
openapi generator
openapi-generatorをコンパイル
openstack
oraclerac
play framework 1.2.5 sample
play! framework
play!framework selenium
playframework テンプレート
postmanとopenapi
prezi プレゼン
pukiwikiで行動管理
pukiwikiに類似したツール
pukiwiki勉強
pukiwiki記事一覧
python
python3のwindowsでの日本語文字化け対応
pythonでseleniumを使う
pythonのテストに使うライブラリ
rails5
reactでポップアップ表示
redmine
ruby on rails 6.0.0
scala
scala 99problem 32~
scala prototype.zip
scala repl
scala sbaz
scala spring
scala/インストール
scalaでまだ不勉強なところ
scalaのインストール
selenium
slack api
spark
spring boot
spring initializerをつかってプロジェクトのひな型をゲットする
spring-test
springboot
springboot env
storybook
sublimetext2
swagger
tracについて
ubuntu
vaadin
vue を typescriptで開発
vue 共通部品作成
vue.js memo
vue.jsとは
vue.jsのデバッグ
vue一覧
webの編集画面のよくあるパターン
windows環境構築
wordpress
xamppについて
•Axis2の本家のスタートガイドによるWebサービスの作り方
【Javascript】【CLIライブラリ】commanderの勉強
【MQL5】KuniRangeBreakoutEA
いまさらながらC++
びっくりする短いコード
アクター
アニメーション
アノテーション
アプリコット
アプリコット PukiWiki
アプリコード
アプリコード林邦行
イラストのエフェクト
インテンショナルプログラミング
カスタマイズjhipster7.9.3イメージ
カブロボ
ガイガーカウンター
クラスとハッシュマップの関係
クラック対策
クロス集計
コマンドラインという概念への考察
コミニュケーション
コード生成
サロゲートキーを使ったテーブル設計
シェルのサンプル
シェルサンプル
スクレイピング
スレッドプログラミングメモ
ソースtoソース変形
ターミナルをAppleScriptで制御
テキストエディタ作成javascriptフレームワーク
テスト用まっさらDBをdockerでたてる
テスト駆動
テレワーク環境の比較
ドット絵
バイオビルダー合成生物学メモ
バグの少ない設計のためのValueObject
パフォーマンスチューニング
フロントエンドのテストの結合テストを減らすには?
プッシュ技術
プログラマーじゃない人に覚えてほしいプログラムのコメントの書き方
プロジェクト管理スプレッドシート
マイクラ 有名ディメンション モッド
マクスウェル方程式
メタ
ラムダ計算について考える
リベリカJava13いいみたい
リモートワークでのプロジェクト注意点
レイアウトツール
ログ解析
世界の構文解析グラマーたち
予定表
予定表/2009-12-14
予定表/2009-12-18
予定表/2009-12-19
予定表/2009-12-22
予定表/2009-12-23
予定表/2009-12-24
事業の心構え
事業計画方針
人工知能とCUDA
人工知能コンペKaggle
仕様書のフォーマットについての考察
他言語サイトサンプル作成
仮説Oracleの罠
作曲と効果音作り
共和分
口コミ
古いRails5を入れる
哲学
大文字小文字変換
学習をHackする
扶養とシステム
投薬のみのガンの治療薬
擬似コーディングのすすめ
放射能対策
数式を扱う
文章を書く
新エネルギー
新年の抱負2010
新技術 プログラム編
日本のゼネコン式IT開発が失敗する理由
最近更新したページ
未来技術/新技術
枯れた技術の水平思考
株価データ
業界の動向
構文解析の記事一覧
正規表現
気象データ
流れるようなインタフェース
管理画面の生成におけるopenapiとJDLなどの考察
細胞の若返り
経済のことをまとめてみる
脆弱性
自分でPlaggerみたいなのを作るためのメモ
論語/学而第一
負荷テスト
販売/デスクトップPC
販売/ノートパソコン
販売/外部ストレージ
起業
酸化グラフェン
開発哲学
電子出版
電子出版の記事一覧
非可換幾何学
顧客分析のデシル分析とRFM分析
DIコンテナについて考える
MP3から携帯着うたを作る方法
[[JHIPSTER一覧]] *** 目次 [#s90f7b0e] #contents * はじめに [#a6f92448] jhipsterでなにが、うれしいかというと、 クラス図をJDLという簡易な設定さえ書けば、 一応動作する画面が、できるということだと思う。 リレーションとかも、考慮済みのテンプレートが、いい感じに、頑張ってくれる。 でも、すでに、自分のプロジェクトのひな型ができている場合がある。 成果物として、望まれているのは、自分のプロジェクトの形式に沿ったコード だったりする。 そうなるとひな形のほうを修正したい。 * もし、ページを追加したい場合 [#xd2fe6b8] 例として、おみくじページの追加例がある。モジュールと呼んでいるらしい。 https://www.jhipster.tech/modules/creating-a-module/ ** モジュール作成のジェネレータもある [#xacd1c6d] https://github.com/jhipster/generator-jhipster-module *** ためしに使ってみる [#wce535e0] 自分がデザインとかしたページのテンプレがつくれたらいいな。 インストールする npm install -g generator-jhipster-module 結論から言うと、これ、windowsだと、うまくいかなかった。yoemanのgenerator-generatorは、動作したから、このモジュールの、jhipsterの読み込みが、新しいJHIPSTERに対応してないっぽい感じ 自分用のモジュールのディレクトリ作る mkdir generator-jhipster-mymod cd generator-jhipster-mymod git使うので、gitのリポジトリとするための初期化 git init yoコマンドで、作るための質問に答える。(Windowsの場合、実行は、PowerShell) yo jhipster-module 質問はこんな感じでした。 ? What is the base name of your module? (helloworld) そのまま、エンター、モジュール名だろうか。 ? Give a description of your module モジュールの説明だろうか description-hello と、回答 ? Do you want to enable hooks for your module from JHipster generator? (Use arrow keys) > No, This is a stand alone module Yes, Enable post entity hook とりあえずNoが、えらばれていたので、そのままEnter ? What is your GitHub username? GitHub使うこと前提?とりあえず、入力 ? Who are you? Firstname Lastname (Firstname Lastname) 氏名を入力 ? Your email? メアドを入力 ? Your home page url? ホームページを入力 > No license Apache License 2.0 GNU General Public License v3.0 MIT License そのまま、NoLicenseにした *** 結果 [#s7a66243] create package.json create .editorconfig create .eslintignore create .eslintrc.json create .gitattributes create .gitignore create .travis.yml create README.md create test\test-app.js create generators\app\index.js create generators\app\templates\dummy.txt ##### USAGE ##### To begin to work: - launch: npm install or yarn install - link: npm link or yarn link - test your module in a JHipster project: - go into your JHipster project - link to your module: npm link generator-jhipster-helloworld or yarn link generator-jhipster-helloworld - launch your module: yo jhipster-helloworld - then, come back here, and begin to code! この、書き込んだ値は、package.jsonというファイルに、出力されている。 そこに対応しているJHIPSTERのバージョンが書いてある。 今使っているのは、JHIPSTER6なんだけど、このツールが対応しているのは、JHIPSTER5 みたい、うごかないかもしれない。 *** 実際に、やってみると、 [#e208bb85] You don't seem to have a generator with the name “jhipster:modules” installed. But help is on the way: と、エラーがでた。 自分の直感としては、 npm linkがwindowsでうまくうごいてないのかな?と思ってみたり して、しらべてみると、 このjhipsterのモジュールジェネレータの作りは、 yoemanのgenerator-generatorをベースにつくっているのだとおもわれます。 質問が、結構似ていたから。多分そうです。 これで、自分のJHIPSTERで作成したプロジェクトに、ディレクトリを移動して、 npm link generator-jhipster-helloworld yo jhipster-helloworld で、確認できるみたい。 *** シンボリックリンクが鬼門 [#yfabbc0b] 下記のサイトを見ると、 npm link をつかうと、globalフォルダにgeneratorが作成されてしまうので、パーミッションの問題や同名のファイルを作成できない等の問題があります。 https://yosuke-furukawa.hatenablog.com/entry/2013/07/14/131903 なので、こんな感じでやっていらっしゃる方がいて、 $ mkdir helloworld $ cd helloworld $ mkdir node_modules $ ln -s <generator-helloworldのパス> node_modules/. さらに、毎回これやるのが面倒だということで、下記のツールをつくったとありました。 https://github.com/yosuke-furukawa/yeomania *** npm linkの順番も関係あるの? [#z885463d] また、npm linkの順番も、下記のサイトをみると、関係あるとかいてありました。 https://60devs.com/simple-way-to-manage-local-node-module-using-npm-link.html *** その他関係ありそうなサイトのメモ [#x11c1486] http://mysticdoll.hatenablog.com/entry/%3Fp%3D264 https://engineering.mixmax.com/blog/troubleshooting-npm-link ** うーん、まだ、エラーだなぁ [#l3da91ca] events.js:174 throw er; // Unhandled 'error' event ^ TypeError: this.getJhipsterAppConfig is not a function at module.exports.readConfig (C:\jhip\generator-jhipster-mymod\generators\app\index.js:16:47) at Object.<anonymous> (C:\jhip\generator-jhipster-mymod\node_modules\generator-jhipster\node_modules\yeoman-generator\lib\index.js:424:27) at C:\jhip\generator-jhipster-mymod\node_modules\run-async\index.js:25:25 at new Promise (<anonymous>) at C:\jhip\generator-jhipster-mymod\node_modules\run-async\index.js:24:19 at self.env.runLoop.add.completed (C:\jhip\generator-jhipster-mymod\node_modules\generator-jhipster\node_modules\yeoman-generator\lib\index.js:425:13) at runCallback (timers.js:705:18) at tryOnImmediate (timers.js:676:5) at processImmediate (timers.js:658:5) Emitted 'error' event at: このエラーどこで起きているのか、ソースコードをみたら、 generaotrs/app/index.jsにて、 readConfig() { this.jhipsterAppConfig = this.getJhipsterAppConfig(); if (!this.jhipsterAppConfig) { this.error('Can\'t read .yo-rc.json'); } }, と、なっているが、これが、どこからも設定されてないが、ソースコード上に、 getJhipsterAppConfig() がなくてはならないつくりなのに、ない。 ** 失われたgetJhipsterAppConfig()を実装するつもりでイメージをつかむ。 [#g8259977] 実装のイメージはこんな感じだろう。 function getJhipsterAppConfig(yo-rc_json) { // yo-rc_json:yo-rc.jsonをパースしたオブジェクト var ret = {}; ret.jhipsterVersion = 6; //JHipsterのバージョン ret.baseName = jdl.baseName; ret.packageName = jdl.packageName ; ret.packageFolder = jdl.packageFolder; ret.clientFramework = jdl.clientFramework; ret.clientPackageManager = jdl.clientPackageManager; ret.buildTool = jdl.buildTool; return ret; } ソースコードを解析すると、 node_modules\generator-jhipster\cli\import-jdl.jsに、次のコードを見つけた getConfig() { if (jhiCore.FileUtils.doesFileExist('.yo-rc.json')) { logger.info('Found .yo-rc.json on path. This is an existing app'); const configuration = jhipsterUtils.getAllJhipsterConfig(null, true); if (_.isUndefined(this.options.interactive)) { logger.debug('Setting interactive true for existing apps'); this.options.interactive = true; } this.applicationType = configuration.applicationType; this.baseName = configuration.baseName; this.databaseType = configuration.databaseType || jhipsterUtils.getDBTypeFromDBValue(this.options.db); this.prodDatabaseType = configuration.prodDatabaseType || this.options.db; this.devDatabaseType = configuration.devDatabaseType || this.options.db; this.skipClient = configuration.skipClient; this.clientFramework = configuration.clientFramework; this.clientFramework = this.clientFramework || 'angularX'; this.clientPackageManager = configuration.clientPackageManager; if (!this.clientPackageManager) { if (this.useNpm) { this.clientPackageManager = 'npm'; } else { this.clientPackageManager = 'yarn'; } } } } * もし、修正したいひな形が下記のいずれかの場合 [#je94886e] JHIPSTERのサブモジュール拡張機能の通称:ブループリント を使ったほうがいいかもしれない。 https://www.jhipster.tech/modules/creating-a-blueprint/ ** ブループリントで拡張可能な、箇所 [#xdb73b75] - common - client - server - entity - entity-client - entity-server - entity-i18n - languages - spring-controller - spring-service *** ブループリントのジェネレータ [#b2d425ae] ジェネレータもある、質問に答えていけば、ブループリントのジェネレータが生成されるとある。 https://github.com/jhipster/generator-jhipster-blueprint * JDLからのパラメータ [#y48f88a2] 以下は、JHIPSTERのソースコードを読んで、直接改造、するための解析 JDLからのパラメータは、どのように拾えるのか。 ** テンプレートファイル [#scf5c772] テンプレートは、yoというツールを使っていると思う。 JDLをyoで使える形式に変換するのが、JHIPSTERだとすると、テンプレートから、変数を引っ張ってくればいいんじゃなかろうか。 generator-jhipster-vuejs は、node_modulesフォルダに、格納されている さらにその配下の、generatorフォルダを、今回解析してみようと思う。 node_moduleフォルダにある、generatorフォルダが怪しいと思っておこう。 どうやら、jhipsterのコマンドは、 アプリフォルダ/node_moduless/generator-jhipster/cli の commands.js ファイルに記載があった。 ただし、ここから、どこかに行くというわけでは、ない。 モジュール側が、リスナーしているようだ。 例えば、import-jdl というコマンドの場合、次のファイルが、このコマンドを待ち構えるモジュールとして作られている。 import-jdl.js たぶん、次の文が、リスナーの実装っぽい。確認してないけど。。。GREPしたらここしか、import-jdlの文言含んでなかった。 const statistics = require('../generators/statistics'); statistics.sendSubGenEvent('generator', 'import-jdl'); * テンプレートのソースコードを読んで、テンプレートの書き方を逆引きにしてみる [#s8b46879] yoのテンプレートの書き方だけでは、役不足だ。JDL言語で簡易に書いた、 クラス図の情報が、どのように、テンプレートの引数にわたってくるのかが、知りたいよね? だから、テンプレートファイルをみて、解析してみるとする。 とりあえず、エンティティまわりをみてみたいので、下記のファイルを観察してみるとする。 EntityRepository.java.ejs ** コメントの書き方 [#w45c20e8] <%# -%> ** パッケージ名 [#v8c39201] package <%=packageName%>.repository; ** エンティティクラス名 [#u1109869] テーブル名とかに使用 <%=asEntity(entityClass)%> または <%=entityClass%> ** 多対多の場合 [#vf1b04ac] <%_ if (fieldsContainOwnerManyToMany) { _%> <%_ } _%> ** データベースの種類がsqlの場合 [#m61c4897] <%_ if (databaseType === 'mongodb') { _%> <%_ } _%> ** SQLのselect句 [#a296506c] select <%= entityInstance %> ** リレーションしてる文だけ必要なループ [#l1799878] <% for (idx in relationships) { if (relationships[idx].relationshipType === 'many-to-many' && relationships[idx].ownerSide === true) { %> left join fetch <%=entityInstance%>.<%=relationships[idx].relationshipFieldNamePlural%><%} }%>", ** リレーションのjavadocが定義されているかどうかチェック [#ra656797] for (idx in relationships) { if (typeof relationships[idx].javadoc != 'undefined') { } } ** フィールドでループ [#d9159b14] <% for (idx in fields) { } _%> ** フィールドのjavadocが定義されているかどうかチェック [#yfb1dc1d] for (idx in fields) { if (typeof fields[idx].javadoc != 'undefined') { } } ** 未確認の引数 [#v805dd3d] fieldsContainBlob importJsonIgnoreProperties importApiModelProperty importJsonIgnore fieldsContainUUID prodDatabaseType hasTextBlob validation searchEngine fieldsContainBigDecimal * jhipster entityとしたときのメッセージの場所 [#z81bf26d] たまたま、みつけたから、メモしておこう。 node_modules\generator-jhipster\generators\entity\prompts.js にある。 * JDLのパーサー [#n21d66b4] jhiCore.JDLImporter のimportメソッド でパースされているようです。 JDLで、認識できる文法を、自分のプロジェクトに合わせれたら、いいんじゃないだろうか? たとえば、案件ごとに、定義書は、大体似ては、いるが、若干、違う。 それをJDLに、まとめさせて、テンプレートに流すことができたら、すごくよさそうだ。 ** JDLImporter [#zc4db629] node_modules\jhipster-core\lib\jdl\jdl_importer.jsにて import() { const parsedJDLContent = parseFiles(this.files); って書いてありました。 function parseFiles(files) { return JDLReader.parseFromFiles(files); } JDLReaderを調べる必要がありそうです。 const JDLReader = require('../reader/jdl_reader'); とあるので、 アプリのフォルダ/node_modules/jhipster-core/lib/reader/jdl_reader を調べる必要がありそうです。 ちょと、ここで、発見したのですが、removeInternalJDLComments というメソッドで、 JavaDocコメントをパース前に、削除して、台無しにしてしまっているようにみえます。 だれか、修正してくれないかぁ。まあ、いいや、解析を進めよう。 const parser = require('../dsl/api'); とあるので、 /node_modules/jhipster-core/jhipster-core/lib/dsl/api.js を見てみると、 まず、JDL言語の字句解析は、 const lexResult = JDLLexer.tokenize(input); でおこなっており、 パーサーは、 const parserSingleton = JDLParser.getParser(); でパーサーの配列で取得できるようになっており、 デフォルトでは、progが使われているのが分かった。 で、パースをうごかしているのは、 buildAst(cst); で、行っているようだ。汎用的につくってあるので、buildAstは、解析しないことにする。 ** lexer.js [#u609c145] 自分用にコマンドを追加するには、 アプリフォルダ/node_modules/jhipster-core\lib/dsl/lexer.js に、下記のような感じで、認識させる単語を登録させる、必要があるだろう。 たとえば、認識させたい単語が required ならば、それをパーサーに伝える際には、 'REQUIRED' として、伝えたいならば、 createToken({ name: 'REQUIRED', pattern: 'required' }); と書かなくてはならない。 この 'REQUIRED'としたものは、node_modules\jhipster-core\lib\dsl\jdl_parser.jsにて const LexerTokens = require('./lexer').tokens; としており、次のように文法のルール定義に記載されている。 { ALT: () => this.CONSUME(LexerTokens.REQUIRED) }, *** 実務でありそうな要件を考えてみる。 [#i39ea552] 項目の定義がエクセルで、設計済みで、JDLでは、不足しているカラムがあるんだよなー。ってのが、一番ありそうなんじゃ、ないだろうか? となると、やりたいことは、 カラムと、その中身の定義を、字句解析と、構文解析に追加する、方法が分かりたいということだ。 近そうな記述は、最大値の認識させ方かなと思って、解析を進めてみる。 ** maxlengthに着目して、解析をする [#a59174a3] *** lexer.jsでのmaxlength [#h19f6f0f] createToken({ name: 'MAXLENGTH', pattern: 'maxlength', categories: [tokens.MIN_MAX_KEYWORD] }); *** jdl_parser.jsでの、MIN_MAX_KEYWORD [#j620febe] minMaxValidation() { this.RULE('minMaxValidation', () => { // Note that "MIN_MAX_KEYWORD" is an abstract token and could match 6 different concrete token types this.CONSUME(LexerTokens.MIN_MAX_KEYWORD); this.CONSUME(LexerTokens.LPAREN); this.OR([{ ALT: () => this.CONSUME(LexerTokens.INTEGER) }, { ALT: () => this.CONSUME(LexerTokens.NAME) }]); this.CONSUME(LexerTokens.RPAREN); }); } *** jdl_parser.jsでの、minMaxValidation [#nc8cd3d4] validation() { this.RULE('validation', () => { this.OR([ { ALT: () => this.CONSUME(LexerTokens.REQUIRED) }, { ALT: () => this.CONSUME(LexerTokens.UNIQUE) }, { ALT: () => this.SUBRULE(this.minMaxValidation) }, { ALT: () => this.SUBRULE(this.pattern) } ]); }); } 以下、同様に解析していくと、呼び出しているメソッドが、次のようになっていました。 ↑ fieldDeclaration ↑ entityBody *** テンプレートfield_validators.ejsでのmaxlengthの使われ方 [#nfc071c7] if (rules.includes('maxlength') && !rules.includes('minlength')) { validators.push('@Size(max = ' + field.fieldValidateRulesMaxlength + ')'); } どこで、fieldValidateRulesMaxlength 入れてるの? 自動かなぁ どうも、テンプレートを見る限りでは、 field.fieldValidateRules, 'maxlength' が定義されているなら、 field.fieldValidateRulesMaxlength は、あたかも定義済みだよね~という記述だ。 * テンプレートは、どのように管理されているのか? [#k9582859] JHIPSTERは、yoを使っているので、yoでは、どのように、ファイルが生成されているのか、 知りたいところである。 ** yo での一番基本的な、プロンプト入力 からの、テンプレートを使った生成の書き方。 [#w26b2772] class extends Generator { async prompting() { this.answers = await this.prompt([{ type : 'input', name : 'title', message : 'Your project title', }]); } writing() { this.fs.copyTpl( this.templatePath('index.html'), this.destinationPath('public/index.html'), { title: this.answers.title } // user answer `title` used ); } } templatePathに、着目してソースファイルをみると、writeFilesToDiskというメソッドで、ファイル生成していることがわかった。 ** 例えば自作のjavaのテンプレート追加するにはどうするか [#o18c7453] javaのコードのテンプレートと、リネームの設定は、次のフォルダに格納されているみたいだ。 generator-jhipster\generators\entity-server このフォルダのindex.jsが、files.jsを参照するような形になっていて、このフォルダのtemplateフォルダに、パラメータを渡すように、設定していることがわかったので、 もし、自分でテンプレートを追加したいのであれば、 - templateフォルダに、テンプレートを入れる。 - files.jsを修正する で、いけそうだ。 *** 参考ページ [#q3e169f5] https://github.com/SAP/chevrotain/blob/master/examples/lexer/keywords_vs_identifiers/keywords_vs_identifiers.js ** パーサー作成ツールキット chevrotain [#a4164c2b] で、パーサどう書けばいいの?ってなるが、JDLで使っているパーサは、chevrotain を使っているようだ。 *** chevrotain のソース [#h48a278b] https://github.com/SAP/chevrotain *** chevrotain のチュートリアル [#f220fc2b] https://sap.github.io/chevrotain/docs/tutorial/step0_introduction.html *** 参考:いろいろなパーサ生成ライブラリの紹介ドキュメント [#a4506e5c] https://tomassetti.me/parsing-in-javascript/#chevrotain
spamではない場合はチェックをいれてください。
タイムスタンプを変更しない
[[JHIPSTER一覧]] *** 目次 [#s90f7b0e] #contents * はじめに [#a6f92448] jhipsterでなにが、うれしいかというと、 クラス図をJDLという簡易な設定さえ書けば、 一応動作する画面が、できるということだと思う。 リレーションとかも、考慮済みのテンプレートが、いい感じに、頑張ってくれる。 でも、すでに、自分のプロジェクトのひな型ができている場合がある。 成果物として、望まれているのは、自分のプロジェクトの形式に沿ったコード だったりする。 そうなるとひな形のほうを修正したい。 * もし、ページを追加したい場合 [#xd2fe6b8] 例として、おみくじページの追加例がある。モジュールと呼んでいるらしい。 https://www.jhipster.tech/modules/creating-a-module/ ** モジュール作成のジェネレータもある [#xacd1c6d] https://github.com/jhipster/generator-jhipster-module *** ためしに使ってみる [#wce535e0] 自分がデザインとかしたページのテンプレがつくれたらいいな。 インストールする npm install -g generator-jhipster-module 結論から言うと、これ、windowsだと、うまくいかなかった。yoemanのgenerator-generatorは、動作したから、このモジュールの、jhipsterの読み込みが、新しいJHIPSTERに対応してないっぽい感じ 自分用のモジュールのディレクトリ作る mkdir generator-jhipster-mymod cd generator-jhipster-mymod git使うので、gitのリポジトリとするための初期化 git init yoコマンドで、作るための質問に答える。(Windowsの場合、実行は、PowerShell) yo jhipster-module 質問はこんな感じでした。 ? What is the base name of your module? (helloworld) そのまま、エンター、モジュール名だろうか。 ? Give a description of your module モジュールの説明だろうか description-hello と、回答 ? Do you want to enable hooks for your module from JHipster generator? (Use arrow keys) > No, This is a stand alone module Yes, Enable post entity hook とりあえずNoが、えらばれていたので、そのままEnter ? What is your GitHub username? GitHub使うこと前提?とりあえず、入力 ? Who are you? Firstname Lastname (Firstname Lastname) 氏名を入力 ? Your email? メアドを入力 ? Your home page url? ホームページを入力 > No license Apache License 2.0 GNU General Public License v3.0 MIT License そのまま、NoLicenseにした *** 結果 [#s7a66243] create package.json create .editorconfig create .eslintignore create .eslintrc.json create .gitattributes create .gitignore create .travis.yml create README.md create test\test-app.js create generators\app\index.js create generators\app\templates\dummy.txt ##### USAGE ##### To begin to work: - launch: npm install or yarn install - link: npm link or yarn link - test your module in a JHipster project: - go into your JHipster project - link to your module: npm link generator-jhipster-helloworld or yarn link generator-jhipster-helloworld - launch your module: yo jhipster-helloworld - then, come back here, and begin to code! この、書き込んだ値は、package.jsonというファイルに、出力されている。 そこに対応しているJHIPSTERのバージョンが書いてある。 今使っているのは、JHIPSTER6なんだけど、このツールが対応しているのは、JHIPSTER5 みたい、うごかないかもしれない。 *** 実際に、やってみると、 [#e208bb85] You don't seem to have a generator with the name “jhipster:modules” installed. But help is on the way: と、エラーがでた。 自分の直感としては、 npm linkがwindowsでうまくうごいてないのかな?と思ってみたり して、しらべてみると、 このjhipsterのモジュールジェネレータの作りは、 yoemanのgenerator-generatorをベースにつくっているのだとおもわれます。 質問が、結構似ていたから。多分そうです。 これで、自分のJHIPSTERで作成したプロジェクトに、ディレクトリを移動して、 npm link generator-jhipster-helloworld yo jhipster-helloworld で、確認できるみたい。 *** シンボリックリンクが鬼門 [#yfabbc0b] 下記のサイトを見ると、 npm link をつかうと、globalフォルダにgeneratorが作成されてしまうので、パーミッションの問題や同名のファイルを作成できない等の問題があります。 https://yosuke-furukawa.hatenablog.com/entry/2013/07/14/131903 なので、こんな感じでやっていらっしゃる方がいて、 $ mkdir helloworld $ cd helloworld $ mkdir node_modules $ ln -s <generator-helloworldのパス> node_modules/. さらに、毎回これやるのが面倒だということで、下記のツールをつくったとありました。 https://github.com/yosuke-furukawa/yeomania *** npm linkの順番も関係あるの? [#z885463d] また、npm linkの順番も、下記のサイトをみると、関係あるとかいてありました。 https://60devs.com/simple-way-to-manage-local-node-module-using-npm-link.html *** その他関係ありそうなサイトのメモ [#x11c1486] http://mysticdoll.hatenablog.com/entry/%3Fp%3D264 https://engineering.mixmax.com/blog/troubleshooting-npm-link ** うーん、まだ、エラーだなぁ [#l3da91ca] events.js:174 throw er; // Unhandled 'error' event ^ TypeError: this.getJhipsterAppConfig is not a function at module.exports.readConfig (C:\jhip\generator-jhipster-mymod\generators\app\index.js:16:47) at Object.<anonymous> (C:\jhip\generator-jhipster-mymod\node_modules\generator-jhipster\node_modules\yeoman-generator\lib\index.js:424:27) at C:\jhip\generator-jhipster-mymod\node_modules\run-async\index.js:25:25 at new Promise (<anonymous>) at C:\jhip\generator-jhipster-mymod\node_modules\run-async\index.js:24:19 at self.env.runLoop.add.completed (C:\jhip\generator-jhipster-mymod\node_modules\generator-jhipster\node_modules\yeoman-generator\lib\index.js:425:13) at runCallback (timers.js:705:18) at tryOnImmediate (timers.js:676:5) at processImmediate (timers.js:658:5) Emitted 'error' event at: このエラーどこで起きているのか、ソースコードをみたら、 generaotrs/app/index.jsにて、 readConfig() { this.jhipsterAppConfig = this.getJhipsterAppConfig(); if (!this.jhipsterAppConfig) { this.error('Can\'t read .yo-rc.json'); } }, と、なっているが、これが、どこからも設定されてないが、ソースコード上に、 getJhipsterAppConfig() がなくてはならないつくりなのに、ない。 ** 失われたgetJhipsterAppConfig()を実装するつもりでイメージをつかむ。 [#g8259977] 実装のイメージはこんな感じだろう。 function getJhipsterAppConfig(yo-rc_json) { // yo-rc_json:yo-rc.jsonをパースしたオブジェクト var ret = {}; ret.jhipsterVersion = 6; //JHipsterのバージョン ret.baseName = jdl.baseName; ret.packageName = jdl.packageName ; ret.packageFolder = jdl.packageFolder; ret.clientFramework = jdl.clientFramework; ret.clientPackageManager = jdl.clientPackageManager; ret.buildTool = jdl.buildTool; return ret; } ソースコードを解析すると、 node_modules\generator-jhipster\cli\import-jdl.jsに、次のコードを見つけた getConfig() { if (jhiCore.FileUtils.doesFileExist('.yo-rc.json')) { logger.info('Found .yo-rc.json on path. This is an existing app'); const configuration = jhipsterUtils.getAllJhipsterConfig(null, true); if (_.isUndefined(this.options.interactive)) { logger.debug('Setting interactive true for existing apps'); this.options.interactive = true; } this.applicationType = configuration.applicationType; this.baseName = configuration.baseName; this.databaseType = configuration.databaseType || jhipsterUtils.getDBTypeFromDBValue(this.options.db); this.prodDatabaseType = configuration.prodDatabaseType || this.options.db; this.devDatabaseType = configuration.devDatabaseType || this.options.db; this.skipClient = configuration.skipClient; this.clientFramework = configuration.clientFramework; this.clientFramework = this.clientFramework || 'angularX'; this.clientPackageManager = configuration.clientPackageManager; if (!this.clientPackageManager) { if (this.useNpm) { this.clientPackageManager = 'npm'; } else { this.clientPackageManager = 'yarn'; } } } } * もし、修正したいひな形が下記のいずれかの場合 [#je94886e] JHIPSTERのサブモジュール拡張機能の通称:ブループリント を使ったほうがいいかもしれない。 https://www.jhipster.tech/modules/creating-a-blueprint/ ** ブループリントで拡張可能な、箇所 [#xdb73b75] - common - client - server - entity - entity-client - entity-server - entity-i18n - languages - spring-controller - spring-service *** ブループリントのジェネレータ [#b2d425ae] ジェネレータもある、質問に答えていけば、ブループリントのジェネレータが生成されるとある。 https://github.com/jhipster/generator-jhipster-blueprint * JDLからのパラメータ [#y48f88a2] 以下は、JHIPSTERのソースコードを読んで、直接改造、するための解析 JDLからのパラメータは、どのように拾えるのか。 ** テンプレートファイル [#scf5c772] テンプレートは、yoというツールを使っていると思う。 JDLをyoで使える形式に変換するのが、JHIPSTERだとすると、テンプレートから、変数を引っ張ってくればいいんじゃなかろうか。 generator-jhipster-vuejs は、node_modulesフォルダに、格納されている さらにその配下の、generatorフォルダを、今回解析してみようと思う。 node_moduleフォルダにある、generatorフォルダが怪しいと思っておこう。 どうやら、jhipsterのコマンドは、 アプリフォルダ/node_moduless/generator-jhipster/cli の commands.js ファイルに記載があった。 ただし、ここから、どこかに行くというわけでは、ない。 モジュール側が、リスナーしているようだ。 例えば、import-jdl というコマンドの場合、次のファイルが、このコマンドを待ち構えるモジュールとして作られている。 import-jdl.js たぶん、次の文が、リスナーの実装っぽい。確認してないけど。。。GREPしたらここしか、import-jdlの文言含んでなかった。 const statistics = require('../generators/statistics'); statistics.sendSubGenEvent('generator', 'import-jdl'); * テンプレートのソースコードを読んで、テンプレートの書き方を逆引きにしてみる [#s8b46879] yoのテンプレートの書き方だけでは、役不足だ。JDL言語で簡易に書いた、 クラス図の情報が、どのように、テンプレートの引数にわたってくるのかが、知りたいよね? だから、テンプレートファイルをみて、解析してみるとする。 とりあえず、エンティティまわりをみてみたいので、下記のファイルを観察してみるとする。 EntityRepository.java.ejs ** コメントの書き方 [#w45c20e8] <%# -%> ** パッケージ名 [#v8c39201] package <%=packageName%>.repository; ** エンティティクラス名 [#u1109869] テーブル名とかに使用 <%=asEntity(entityClass)%> または <%=entityClass%> ** 多対多の場合 [#vf1b04ac] <%_ if (fieldsContainOwnerManyToMany) { _%> <%_ } _%> ** データベースの種類がsqlの場合 [#m61c4897] <%_ if (databaseType === 'mongodb') { _%> <%_ } _%> ** SQLのselect句 [#a296506c] select <%= entityInstance %> ** リレーションしてる文だけ必要なループ [#l1799878] <% for (idx in relationships) { if (relationships[idx].relationshipType === 'many-to-many' && relationships[idx].ownerSide === true) { %> left join fetch <%=entityInstance%>.<%=relationships[idx].relationshipFieldNamePlural%><%} }%>", ** リレーションのjavadocが定義されているかどうかチェック [#ra656797] for (idx in relationships) { if (typeof relationships[idx].javadoc != 'undefined') { } } ** フィールドでループ [#d9159b14] <% for (idx in fields) { } _%> ** フィールドのjavadocが定義されているかどうかチェック [#yfb1dc1d] for (idx in fields) { if (typeof fields[idx].javadoc != 'undefined') { } } ** 未確認の引数 [#v805dd3d] fieldsContainBlob importJsonIgnoreProperties importApiModelProperty importJsonIgnore fieldsContainUUID prodDatabaseType hasTextBlob validation searchEngine fieldsContainBigDecimal * jhipster entityとしたときのメッセージの場所 [#z81bf26d] たまたま、みつけたから、メモしておこう。 node_modules\generator-jhipster\generators\entity\prompts.js にある。 * JDLのパーサー [#n21d66b4] jhiCore.JDLImporter のimportメソッド でパースされているようです。 JDLで、認識できる文法を、自分のプロジェクトに合わせれたら、いいんじゃないだろうか? たとえば、案件ごとに、定義書は、大体似ては、いるが、若干、違う。 それをJDLに、まとめさせて、テンプレートに流すことができたら、すごくよさそうだ。 ** JDLImporter [#zc4db629] node_modules\jhipster-core\lib\jdl\jdl_importer.jsにて import() { const parsedJDLContent = parseFiles(this.files); って書いてありました。 function parseFiles(files) { return JDLReader.parseFromFiles(files); } JDLReaderを調べる必要がありそうです。 const JDLReader = require('../reader/jdl_reader'); とあるので、 アプリのフォルダ/node_modules/jhipster-core/lib/reader/jdl_reader を調べる必要がありそうです。 ちょと、ここで、発見したのですが、removeInternalJDLComments というメソッドで、 JavaDocコメントをパース前に、削除して、台無しにしてしまっているようにみえます。 だれか、修正してくれないかぁ。まあ、いいや、解析を進めよう。 const parser = require('../dsl/api'); とあるので、 /node_modules/jhipster-core/jhipster-core/lib/dsl/api.js を見てみると、 まず、JDL言語の字句解析は、 const lexResult = JDLLexer.tokenize(input); でおこなっており、 パーサーは、 const parserSingleton = JDLParser.getParser(); でパーサーの配列で取得できるようになっており、 デフォルトでは、progが使われているのが分かった。 で、パースをうごかしているのは、 buildAst(cst); で、行っているようだ。汎用的につくってあるので、buildAstは、解析しないことにする。 ** lexer.js [#u609c145] 自分用にコマンドを追加するには、 アプリフォルダ/node_modules/jhipster-core\lib/dsl/lexer.js に、下記のような感じで、認識させる単語を登録させる、必要があるだろう。 たとえば、認識させたい単語が required ならば、それをパーサーに伝える際には、 'REQUIRED' として、伝えたいならば、 createToken({ name: 'REQUIRED', pattern: 'required' }); と書かなくてはならない。 この 'REQUIRED'としたものは、node_modules\jhipster-core\lib\dsl\jdl_parser.jsにて const LexerTokens = require('./lexer').tokens; としており、次のように文法のルール定義に記載されている。 { ALT: () => this.CONSUME(LexerTokens.REQUIRED) }, *** 実務でありそうな要件を考えてみる。 [#i39ea552] 項目の定義がエクセルで、設計済みで、JDLでは、不足しているカラムがあるんだよなー。ってのが、一番ありそうなんじゃ、ないだろうか? となると、やりたいことは、 カラムと、その中身の定義を、字句解析と、構文解析に追加する、方法が分かりたいということだ。 近そうな記述は、最大値の認識させ方かなと思って、解析を進めてみる。 ** maxlengthに着目して、解析をする [#a59174a3] *** lexer.jsでのmaxlength [#h19f6f0f] createToken({ name: 'MAXLENGTH', pattern: 'maxlength', categories: [tokens.MIN_MAX_KEYWORD] }); *** jdl_parser.jsでの、MIN_MAX_KEYWORD [#j620febe] minMaxValidation() { this.RULE('minMaxValidation', () => { // Note that "MIN_MAX_KEYWORD" is an abstract token and could match 6 different concrete token types this.CONSUME(LexerTokens.MIN_MAX_KEYWORD); this.CONSUME(LexerTokens.LPAREN); this.OR([{ ALT: () => this.CONSUME(LexerTokens.INTEGER) }, { ALT: () => this.CONSUME(LexerTokens.NAME) }]); this.CONSUME(LexerTokens.RPAREN); }); } *** jdl_parser.jsでの、minMaxValidation [#nc8cd3d4] validation() { this.RULE('validation', () => { this.OR([ { ALT: () => this.CONSUME(LexerTokens.REQUIRED) }, { ALT: () => this.CONSUME(LexerTokens.UNIQUE) }, { ALT: () => this.SUBRULE(this.minMaxValidation) }, { ALT: () => this.SUBRULE(this.pattern) } ]); }); } 以下、同様に解析していくと、呼び出しているメソッドが、次のようになっていました。 ↑ fieldDeclaration ↑ entityBody *** テンプレートfield_validators.ejsでのmaxlengthの使われ方 [#nfc071c7] if (rules.includes('maxlength') && !rules.includes('minlength')) { validators.push('@Size(max = ' + field.fieldValidateRulesMaxlength + ')'); } どこで、fieldValidateRulesMaxlength 入れてるの? 自動かなぁ どうも、テンプレートを見る限りでは、 field.fieldValidateRules, 'maxlength' が定義されているなら、 field.fieldValidateRulesMaxlength は、あたかも定義済みだよね~という記述だ。 * テンプレートは、どのように管理されているのか? [#k9582859] JHIPSTERは、yoを使っているので、yoでは、どのように、ファイルが生成されているのか、 知りたいところである。 ** yo での一番基本的な、プロンプト入力 からの、テンプレートを使った生成の書き方。 [#w26b2772] class extends Generator { async prompting() { this.answers = await this.prompt([{ type : 'input', name : 'title', message : 'Your project title', }]); } writing() { this.fs.copyTpl( this.templatePath('index.html'), this.destinationPath('public/index.html'), { title: this.answers.title } // user answer `title` used ); } } templatePathに、着目してソースファイルをみると、writeFilesToDiskというメソッドで、ファイル生成していることがわかった。 ** 例えば自作のjavaのテンプレート追加するにはどうするか [#o18c7453] javaのコードのテンプレートと、リネームの設定は、次のフォルダに格納されているみたいだ。 generator-jhipster\generators\entity-server このフォルダのindex.jsが、files.jsを参照するような形になっていて、このフォルダのtemplateフォルダに、パラメータを渡すように、設定していることがわかったので、 もし、自分でテンプレートを追加したいのであれば、 - templateフォルダに、テンプレートを入れる。 - files.jsを修正する で、いけそうだ。 *** 参考ページ [#q3e169f5] https://github.com/SAP/chevrotain/blob/master/examples/lexer/keywords_vs_identifiers/keywords_vs_identifiers.js ** パーサー作成ツールキット chevrotain [#a4164c2b] で、パーサどう書けばいいの?ってなるが、JDLで使っているパーサは、chevrotain を使っているようだ。 *** chevrotain のソース [#h48a278b] https://github.com/SAP/chevrotain *** chevrotain のチュートリアル [#f220fc2b] https://sap.github.io/chevrotain/docs/tutorial/step0_introduction.html *** 参考:いろいろなパーサ生成ライブラリの紹介ドキュメント [#a4506e5c] https://tomassetti.me/parsing-in-javascript/#chevrotain
テキスト整形のルールを表示する