緣由
導了幾天的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