egret隨筆-publish命令的改進


緣由

  導了幾天的ipa,每次publish后都要改zip包名的代碼,終於鼓起勇氣翻看了一下egret publish的代碼,唉,這代碼。。。
應該不會是北京的那幾個大牛寫的吧???


正題
  看了源碼才知道為什么android版的publish會直接把代碼改掉,而ios版的不會了
先來分析一下publish的Entrance吧,對於android版的代碼,因為是java的代碼,而android的包名就是app的標識,所以找到包名就能找到目標java文件,然后那個誰就很機智的找到了AndroidManifest.xml文件,里面正好配置有主類的包名和類名,然后順理成章地找到java文件,然后replace掉版本號和其他東東。。。
  那么,問題來了,xcode的project是沒有AndroidManifest.xml的,那怎么辦呢?
沒辦法,我試着在function run(dir, args, opts){}的三個參數里找答案,結果沒找到,都沒有想要的xcode project的name。
  然后我想到了egretProperties.json,心里想着這里會不會配置native project name之類的東西呢,結果還是失望,只有兩個path:android_path和ios_path,其實這兩個是可以拿來提取nativePorjectName的,但是,如果,path很長呢,那就沒辦法(約定可以解決這個問題
  還是沒辦法,那只能從目錄結構上找答案了,結果還真有,在proj.ios目錄下,有兩個文件夾,一個就是對應的nativePorjectName,還有一個就是nativePorjectName + “.xcodeproj”,那豈不美哉,然后我就只能用傳統方法來處理了,遍歷proj.ios目錄,直到找到.xcodeproj結尾的文件夾,然后取其前面部分作為nativePorjectName,然后就定位到了AppDelegate.mm文件,然后replace掉版本號和其他東東。。。


約定
  但是,因為egret解決方案的局限,我的解決方案是需要一個約定的,約定開發者不擅自修改那個文件夾的名字否則就定位不到了。
隨便說說
  看了publish.js的代碼,一開始,其實我是拒絕的,但是沒辦法。那代碼雖然完成了功能,但是那代碼效率實在不行啊,不像是大牛的手筆

1 if (file.exists(path.join(url, "src", javaName + ".java"))) {
2     javaPath = path.join(url, "src", javaName + ".java");
3     javaContent = file.read(javaPath);
4 }
5 else if (file.exists(path.join(url, "src", filePath, javaName + ".java"))) {
6     javaPath = path.join(url, "src", filePath, javaName + ".java");
7     javaContent = file.read(javaPath);
8 }

  雖然v8引擎效率很高,但是egret的命令行畢竟是命令,必須要優化。
還有就是代碼重用性比較弱,egret命令作為整個命令的入口,然后分派個幾個自命令來執行,但是為什么不在分派前就把諸如項目名,開發平台信息,目標平台信息之類的全部准備好呢,看得我好惆悵,現在就給出了基礎的命令參數而已。


建議
  也不敢怎么建議egret的開發者,就建議能把命令行規范定好了再動手,期待能在下一個大版本中能統一一下命令行,支持更多參數,這樣第三方工具也會脫穎而出的,想必對egret來說是一個很好促進吧!

成果
  我修改了publish.js,添加了一個changeCodeEntrance.js,放棄了之前的changeJavaEntrance.js,changeCodeEntrance做了平台兼容,通過platform來識別平台,其實這個在changeJavaEntrance里已經攜帶了參數,但是沒利用。。。定位java代碼的那塊沒動。
  如果需要就拿去用用吧,親測可用,download url:egret-publish.rar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM