freemarker ftl模板_效率提升百分之四十,AS模板也太好用了吧
點擊藍字 輕松關注
CV 工程師你好,以下內容會讓你感覺到不適,慎入!
在平時的開發工作中,我們經常將一個地方的代碼,復制粘貼到另外一個地方,俗稱搬磚,搬磚搬多了,作為一個資深的挨踢民工,難免會總結一些提高生產力的搬磚經驗
Android Studio 模板是個提高生產力的好東西,使用過 MVPArms 的朋友,都應該使用過我提供的配套模板,使用該套模板,一鍵即可生成整個頁面需要的所有文件,甚至還可以一鍵生成整個 Module,真正的解放了大家的雙手,讓大家的雙手可以去做更多熱愛的事情
Android Stuidio 模板一共有 4 種類型,分別對應不同的功能,我先來簡單介紹下這 4 種模板,最后再著重介紹下一鍵生成 Module 的模板,因為前面 3 種模板在網上有太多優秀的教程了,而 Module 模板的資料非常少,我再重復寫一遍前 3 種模板的教程也不一定有別人寫得好,意義并不大,所以我前面只做簡單介紹,后面會貼出一些教程鏈接,沒了解過的就當科普了,了解過的就直接跳過
現在還差幾個 star 就超過 Mozilla 在模板語言 Freemarker 中排名 star 全球第一了,讓我得瑟一下?
Live Templates
Live Templates 的功能主要是根據關鍵字快速生成代碼塊
在設置中找到 Live Templates,點擊紅框中的按鈕 "+",即可新建 Live Templates
File Templates
File Templates 顧名思義,主要功能就是一鍵生成單個文件
在設置中找到 File and Code Templates,點擊紅框中的按鈕 "+",即可新建 File Templates
Activity Templates
Activity Templates 可以一鍵生成多個文件,但不光可以生成 Activity 文件,還可以根據需求生成任何 Java 文件、XML 文件以及其他類型的文件
新建 Activity Templates 要比上面的兩個模板復雜的多,需要使用到 FreeMarker,感興趣的朋友,可以看看我開源的 Activity Templates(https://github.com/JessYanCoding/MVPArmsTemplate),稍微修改一下就能應用到自己的項目當中
Module Templates
Module Templates 可以一鍵生成 Module 以及 Module 中所需要的所有文件
Module Templates 也是使用 FreeMarker 創建的,如果你能理解 Activity Templates,那你也可以快速的新建一個 Module Templates
詳解 Module Templates
不知道大家了解過一鍵生成 Module 的 Android Stuidio 模板嗎,這種類型的模板我在網上沒搜到有相關的開源庫和文章,所以我就自己研究了一段時間,在去年就開源給了 MVPArms 的使用者
Module Templates 其實要比 Activity Templates 簡單很多,因為 Module Templates 的某些限制,導致它的配置面板不能自定義一些新增的功能,所以復雜性降低很多,但是功能性和靈活性就要弱于 Activity Templates,不過即使這樣也能滿足我們大部分的需求了
Android Studio 中所有的 Module Templates 都放在 gradle-projects 這個目錄中(Android Studio 安裝目錄/plugins/android/lib/templates/gradle-projects),如果按照很多教程中對 Activity Templates 學習方法的描述,我們應該按照和 Activity Templates 一樣的學習方式,打開 gradle-projects 目錄中的 NewAndroidModule 進行學習
但是我可以告訴大家,在你沒有足夠經驗的情況下,最好不要這樣做,因為這個文件夾中包含著 Android Studio 創建 Android Module 所需要的所有文件和代碼,里面比較復雜,有很多判斷條件,很多東西對你的項目來說都用不到,在學習時會耽誤你很多時間
所以為了讓大家快速上手,我就用我已經開源的 Module Templates(https://github.com/JessYanCoding/MVPArms-Module-Template) 作為學習案例,里面的所有文件和代碼都是經過我篩選過后提取出來的,非常易于大家學習和理解
Module Templates 結構
NewArmsComponent├──?root
│???├──?res?//Module?中的資源文件都放這里
│???├──?├──?anim
│???├──?├──?layout
│???├──?├──?mipmap-hdpi
│???├──?├──?mipmap-xhdpi
│???├──?├──?mipmap-xxhdpi
│???├──?├──?mipmap-xxxhdpi
│???├──?├──?values
│???├──?src/app_package???//Module?中的源文件模板都放這里
│???├──?├──?ActivityLifecycleCallbacksImpl.java.ftl
│???├──?├──?Api.java.ftl
│???├──?├──?AppLifecyclesImpl.java.ftl
│???├──?├──?...
│???├──?test/app_package???//Module?中的測試文件模板都放這里
│???├──?├──?ExampleInstrumentedTest.java.ftl
│???├──?├──?ExampleUnitTest.java.ftl
│???├──?AndroidManifest.xml.ftl???//AndroidManifest.xml?模板文件
│???├──?CMakeLists.txt.ftl???//不用?CMake?可以忽略
│???├──?build.gradle.ftl???//App?build.gradle?模板文件
│???├──?native-lib.cpp.ftl???//不用?C?可以忽略
│???├──?root-build.gradle.ftl???//根目錄?build.gradle?模板文件
│???├──?settings.gradle.ftl???//settings.gradle?模板文件
├──?globals.xml.ftl
├──?recipe.xml.ftl
├──?template.xml
├──?template_new_project.png
root 文件夾下包含的是生成 Module 所需要的模板文件,template_new_project.png 是模板的封面圖,globals.xml.ftl 我們暫時用不到,recipe.xml.ftl、template.xml 這兩個文件存放的是模板的配置參數,是整個模板的核心文件,我們來看看這兩個文件
template.xml
template.xml 放置的是配置面板的參數,配置面板是什么東西?看下圖
Module Templates 和 Activity Templates 的配置面板不一樣,Activity Templates 可以任意修改和新增配置面板中的項目,但是 Module Templates 不可以,只能固定為圖中的這四項
看看 template.xml 里面的內容
<?xml ?version="1.0"?><templateformat="5"revision="2"name="MVPArms?Module"description="Creates?a?new?MVPArms?Module.">
????<category?value="Application"?/>
????<formfactor?value="Things"?/>
-----------------------?分割線?-----------------------
????<thumbs>
????????<thumb>template_new_project.pngthumb>
????thumbs>
????<parameterid="packageName"name="Package?name"type="string"constraints="app_package|nonempty"default="com.mycompany.myapp"?/>
????...
?<globals?file="globals.xml.ftl"?/>
?<execute?file="recipe.xml.ftl"?/>
template>????????
只用看分割線以上的標簽即可,下面的標簽基本用不上,每個 parameter 標簽在配置面板中都對應一個項目,但 parameter 標簽只在 Activity Templates 中可以任意修改和新增,在 Module Templates 中的任何修改和新增都是無效的,這點大家可以試試
name 標簽和 description 標簽顧名思義,這就不用多解釋了,category 標簽固定為 Application 即可
這里要特別要提一下 formfactor 標簽,在 NewAndroidModule 中,formfactor 標簽的值為 Mobile,最開始我也和它一樣,將值賦為 Mobile,結果發現無法生成文件,我想可能是 Android Studio 只允許存在一個 Android 的 Module 模板,我又試著改成了 TV、Glass、Wear ...,發現都不完美,要不是無法生成文件,要不就生成太多不需要的文件,最后改成 Things 后,效果就接近完美了
recipe.xml.ftl
recipe.xml.ftl 的功能就是告訴模板引擎,你打算怎么處理你的模板文件
<?xml ?version="1.0"?><recipe>
????<mkdir?at="${escapeXmlAttribute(projectOut)}/libs"?/>
????<mkdir?at="${escapeXmlAttribute(resOut)}/anim"?/>
????<mkdir?at="${projectOut}/src/main/java/${slashedPackageName(packageName)}/app/utils"?/>
????<merge?from="root/settings.gradle.ftl"to="${escapeXmlAttribute(topOut)}/settings.gradle"?/>
????<merge?from="root/root-build.gradle.ftl"to="${escapeXmlAttribute(topOut)}/build.gradle"?/>
????<copy?from="root/res/mipmap-hdpi/ic_launcher.png"to="${escapeXmlAttribute(resOut)}/mipmap-hdpi/ic_launcher.png"?/>
????<copy?from="root/res/mipmap-xhdpi/ic_launcher.png"to="${escapeXmlAttribute(resOut)}/mipmap-xhdpi/ic_launcher.png"?/>
????<copy?from="root/res/mipmap-xxhdpi/ic_launcher.png"to="${escapeXmlAttribute(resOut)}/mipmap-xxhdpi/ic_launcher.png"?/>
????<copy?from="root/res/mipmap-xxxhdpi/ic_launcher.png"to="${escapeXmlAttribute(resOut)}/mipmap-xxxhdpi/ic_launcher.png"?/>??????????????????
????<instantiate?from="root/build.gradle.ftl"to="${escapeXmlAttribute(projectOut)}/build.gradle"?/>
????<instantiate?from="root/AndroidManifest.xml.ftl"to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml"?/>
????<instantiate?from="root/res/values/styles.xml.ftl"to="${escapeXmlAttribute(resOut)}/values/styles.xml"?/>
????<instantiate?from="root/src/app_package/GlobalConfiguration.java.ftl"to="${projectOut}/src/main/java/${slashedPackageName(packageName)}/app/GlobalConfiguration.java"?/>
????<open?file="${projectOut}/src/main/java/${slashedPackageName(packageName)}/app/GlobalConfiguration.java"?/>
????<instantiate?from="root/src/app_package/AppLifecyclesImpl.java.ftl"to="${projectOut}/src/main/java/${slashedPackageName(packageName)}/app/AppLifecyclesImpl.java"?/>
????<open?file="${projectOut}/src/main/java/${slashedPackageName(packageName)}/app/AppLifecyclesImpl.java"?/>
<#if?unitTestsSupported>
????<instantiate?from="root/test/app_package/ExampleUnitTest.java.ftl"to="${escapeXmlAttribute(unitTestOut)}/ExampleUnitTest.java"?/>
#if>??????????
recipe>
Module 所需要的模板文件都放在 root 文件夾下,而使用 recipe.xml.ftl 中的標簽就是為了告訴模版引擎,你打算將哪個模板文件通過什么方式放到 Module 中的什么位置
mkdir 標簽,顧名思義,就是生成一個空的文件夾
merge 標簽中的 from 填寫模板文件的地址,to 填寫 Module 中的目標位置,merge 標簽會將 from 中填寫的模板文件,放到 to 中填寫的目標位置上,如果目標位置已經存在一個相同文件名的文件,則將模板文件中的全部內容復制到已經存在的文件中,否則則創建一個新的文件
copy 標簽會將 from 中填寫的文件,放到 to 中填寫的目標位置上,如果目標位置已經存在一個相同文件名的文件,則會覆蓋此文件
instantiate 標簽會將 from 中填寫的模板文件,放到 to 中填寫的目標位置上,如果目標位置已經存在一個相同文件名的文件,則會覆蓋此文件,看描述和 copy 標簽差不多,那它們的區別是什么呢?
copy 標簽的目標對象是普通文件,也就是沒有 .ftl 后綴的文件,instantiate 標簽的目標對象是模板文件,也就是有 .ftl 后綴的文件,那有 .ftl 后綴的文件和沒有 .ftl 后綴的文件有什么區別呢?
有 .ftl 后綴的文件中可以使用 FreeMarker 語法,在生成文件時,模版引擎會根據文件中的 FreeMarker 語法對文件內容進行相應的修改,比如根據不同的條件生成不同的內容,而沒有 .ftl 后綴的文件,文件中的內容一旦確定在生成時是無法改變的,就如同單純的復制粘貼
${escapeXmlAttribute(resOut)} 對應的是 Module 中的 res 文件夾
${projectOut}/src/main/java/${slashedPackageName(packageName)} 對應的是包名下的根目錄
${escapeXmlAttribute(topOut)} 對應的是整個工程的根目錄
${escapeXmlAttribute(projectOut)} 對應的是 Module 的根目錄
${escapeXmlAttribute(manifestOut)} 對應的是放置 AndroidManifest.xml 的文件夾
${escapeXmlAttribute(testOut)} 對應的是 Module 中放置測試文件的文件夾
模板文件
root 文件夾下模板文件的編寫也不難,因為 Module Templates 沒有用到自定義變量,所以大多數情況下,就是將你寫好的 java 文件,后面加上 .ftl 后綴即可,看看下面我貼出的源代碼鏈接,你很快就能上手
你如果還想學到更多的 FreeMarker 語法,可以翻翻下面貼出的 FreeMarker 中文文檔
開源代碼鏈接
我給 MVPArms 寫的 File Templates:
https://github.com/JessYanCoding/MVPArms/blob/master/MVP_generator_solution
我給 MVPArms 寫的 Activity Templates:
https://github.com/JessYanCoding/MVPArmsTemplate
我給 MVPArms 寫的 Module Templates:
https://github.com/JessYanCoding/MVPArms-Module-Template
我給組件化項目寫的 Module Templates:
https://github.com/JessYanCoding/ArmsComponent-Template
教程鏈接
快速寫出 Activity Templates 的插件:
https://www.jianshu.com/p/e3548f441440
Live Templates 教程:
https://www.jianshu.com/p/065877f0c33d
File Templates 教程:
https://www.jianshu.com/p/57e734864b46
Activity Templates 教程:
https://blog.csdn.net/lmj623565791/article/details/51635533
FreeMarker 中文文檔:
http://freemarker.foofun.cn/toc.html
總結
以上是生活随笔為你收集整理的freemarker ftl模板_效率提升百分之四十,AS模板也太好用了吧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 挂机宝装mysql_挂机宝安装
- 下一篇: 机器人踩滑板_不死神草、飞行滑板…超20