@mooreds,感谢您成为唯一一个回答我的第一个 Stack Overflow 问题的人!但是,我自己已经解决了这个问题,并将与可能需要它的其他人分享我的解决方案......
我决定分叉 Cordova CLI,分析代码,看看是否能提出解决方案。
似乎负责更新特定平台的“www”目录的主要文件位于/usr/local/lib/node_modules/cordova/src/metadata/<platform>_parser.js
平台<platform>
名称(ios、android 等)的位置。
大多数文件都有相同的逻辑,所以我只会发布iOS...
第一个问题......在update_project
方法中,有一个util.deleteSvnFolders(self.www_dir())
函数调用。顾名思义,这是为了从项目 www 目录中删除 .svn 文件夹。可能是因为它们是从源代码控制的根 www 复制的,但在平台 www 文件夹中不需要。就我而言,我仍然不想复制原始的 .svn 文件夹,但我当然不想删除它们。相反,不要一开始就复制它们,我们也不必删除它们。
下面是 update_project 方法,我在其中注释掉了相关方法:
update_project:function(cfg, callback) {
var self = this;
this.update_from_config(cfg, function(err) {
if (err) {
if (callback) callback(err);
else throw err;
} else {
self.update_www();
self.update_overrides();
self.update_staging();
//util.deleteSvnFolders(self.www_dir());
if (callback) callback();
}
});
}
现在第二部分在update_www
上面的方法中。此方法使用shell.rm
andshell.cp
删除整个“www”目录,然后将根“www”目录复制到项目文件夹中。当然,这个问题在于它删除了所有 .svn 文件夹和“www”文件夹。
要解决此问题,请输入rsync
. rsync 允许以更健壮的级别复制文件,在这种情况下,允许我们排除路径。所以我将这两行修改为一个操作rsync
:
update_www:function() {
var projectRoot = util.isCordova(this.path);
var www = util.projectWww(projectRoot);
var project_www = this.www_dir();
// Copy all files from root www to project www, excluding .svn directories.
// rsync copies only files that are changed
shell.exec("rsync -a --exclude='.svn/' " + www + "/ " + project_www);
// write out proper cordova.js
var custom_path = config.has_custom_path(projectRoot, 'ios');
var lib_path = path.join(util.libDirectory, 'ios', 'cordova', require('../../platforms').ios.version);
if (custom_path) lib_path = custom_path;
shell.cp('-f', path.join(lib_path, 'CordovaLib', 'cordova.js'), path.join(project_www, 'cordova.js'));
}
这里的重要部分是--exclude='.svn/'
选项。这告诉 rsync 排除匹配 --exclude='XXX' 的项目。在这种情况下,.svn/
。还值得注意的是"www" + "/ "
我添加的正斜杠。这告诉 rsync 复制到“www”文件夹,而不是“www”文件夹本身。更多排除参数可用于其他类型,例如 cvs 或其他版本控制文件/文件夹。
现在,运行cordova prepare
只会将需要的文件从根“www”文件夹复制到每个平台的“www”文件夹中!
另一个很酷的副作用是rsync
仅复制默认情况下已更改的文件。这意味着通过源代码管理仅对您更改的文件进行签入,而不是由于完全覆盖而对整个目录进行签入。尼托!
其他注意事项:
- 每个
<platform>_parser.js
文件的处理方式略有不同,变量名称也略有不同。我只针对iOS和Android,所以我没有打扰其他人。
- 不,我没有费心将代码提交给 Cordova,因为我现在不知道如何也没有时间。希望分享我来到这里的解决方案能够平衡我失去的业力点数。
-麦克风