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

时间: 2024-10-24 16:34:33

egret随笔-publish命令的改进的相关文章

Msfconsole中set payload命令最新改进

Msfconsole中set payload命令最新改进 为了方便用户的输入,Msfconsole改进了set payload命令的输入.在执行set payload命令时,可以使用三种前缀,分别是/payload.payload.和/.或者,不使用任何前缀,直接指定攻击载荷路径即可.其中,可以执行的四种方式如下所示: (1)msf5 exploit(windows/smb/ms17_010_eternalblue) > set payload /payload/windows/x64/mete

PuTTY 命令行改进 有效解决 中文乱码

PuTTY  是一个免费且跨平台的并支持SSH和Telnet 的客户端, 包括xterm 终端模拟器. 它由Simon Tatham 编写并维护. http://www.chiark.greenend.org.uk/~sgtatham/putty/原版本对命令行 指定 页码  字体和字体大小 并不支持, 只能在配置中手动配置. 这个并不符合一些项目中批量部署的用户, 因此手动配置极为不便, 便自己进行对源码修改. 我修改的这版则对使用代码页, 字体 和字体大小的 命令行 内容进行了支持, 由于p

Linux随笔---tar命令

一.解压 语法:tar  [主选项+辅选项]  文件或者目录 使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项是辅助使用的,可以选用.主选项:c 创建新的档案文件.如果用户想备份一个目录或是一些文件,就要选择这个选项.相当于打包. x 从档案文件中释放文件.相当于拆包. t 列出档案文件的内容,查看已经备份了哪些文件. 特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在!因为不可能同时压缩与解压缩.辅助选项: -z :是否同时具有 gzip 的属性?亦即是否需要

javascript设计模式——Publish/Subscribe

我们先引出问题的所在,这里使用一个订单系统: 在一个电子商务系统中,现在我们有订单模块,和信息模块两个主要模块,当下单成功时,我们用要发送订单信息的给客户. 下面是一个简单的解决办法,我们在一个类中调用另一个类的方法. // 订单类,存储订单的所有变量和函数 function Order( goods ){ this.goods = goods; } Order.prototype = { done: function(){ // 订单完成代码 this.sendSuccessMsg(); },

redis实战笔记(3)-第3章 Redis命令

第3章 Redis命令 本章主要内容 字符串命令. 列表命令和集合命令 散列命令和有序集合命令 发布命令与订阅命令 其他命令 在每个不同的数据类型的章节里, 展示的都是该数据类型所独有的. 最具代表性的命令. 首先让我们来看看, 除了GET和SET之外, Redis的字符串还支持哪些命令. 3.1 字符串 在Redis里面, 字符串可以存储以下3种类型的值. 字节串( byte string) . 整数. 浮点数. 除了自 增操作和自 减操作之外, Redis还拥有对字节串的其中一部分内容进行读

命令行中的数据科学

目录 前言 XIII 第1章 简介 1 1.1 概述 1 1.2 数据科学就是OSEMN 2 1.2.1 数据获取 2 1.2.2 数据清洗 2 1.2.3 数据探索 3 1.2.4 数据建模 3 1.2.5 数据解释 3 1.3 插入的几章 4 1.4 什么是命令行 4 1.5 为什么用命令行做数据科学工作 6 1.5.1 命令行的灵活性 6 1.5.2 命令行可增强 6 1.5.3 命令行可扩展 7 1.5.4 命令行可扩充 7 1.5.5 命令行无处不在 7 1.6 一个现实用例 8 1.

理解ASP.NET 5运行时命令:DNVM, DNX, 和DNU

ASP.NET 5 引入了一个新型的运行时,让我们可以现场交付模式组合式构建应用程序,而不依赖于宿主机上的.NET框架.这种新模式为我们提供了命令行工具(DNVM.DNX.DNU)用于管理我们的.net 版本,依赖的库和运行环境,我们可以不需要Visual Studio,只需要一个文本编辑器和命令行就可以开发一个应用程序. 了解.NET 版本管理器 (DNVM) 之间 ,.NET 执行环境 (DNX) 和.NET 开发实用程序 (DNU) 之间的关系是开发 ASP.NET 5的根本.在这篇文章我

redis 从0 到 1 键值相关命令 服务器相关命令

keys * 获取所有的key   忽略其数据类型 数据为空   返回(empty list or set) keys a* .*b 获取以a开头 或者 以b结尾的key 返回(empty list or set) exists key 判断key是否存在   存在返回1  不存在返回0 del key 删除key   返回 受影响key的个数 expire key seconds  设置key的过期时间 单位为秒 persist  key   消除key的过期时间设置 move key db

redis常用命令及高级特性

11.redis常用命令 keys * 返回所有的键 keys my* 模糊匹配 exists key 确认key是否存在 del key expire key time对现有的键设置过期时间[秒为单位] ttl key 查看过期时间,-1代表已过期 move 将当期数据库中的key移到其它数据库当中 select database_name 选择数据库 move key database_name persist key 取消过期时间,此时ttl key返回-1并不代表过期 randomkey