在我的正常工作流程中,我正在管理Cordova项目的根“www”文件夹中的所有代码。当我准备部署到设备/设备时,我运行Cordova“cordova prepare”命令,据我所知,该命令只需将必要的资产复制到每个平台的相应文件夹。
执行此操作时,该命令会干扰SVN并从源代码管理中删除平台的“www”目录。我假设这意味着该命令删除此文件夹中的所有内容并替换为根“www”内容,从而删除管理源控制信息的“.svn”文件夹。
有谁知道如何防止这种情况发生?我已经听过并读过一些关于Cordova“钩子”功能的内容,但是有一丝线索可以说明它是如何工作的,也不知道如何实现“钩子”以实现我的目标。
答案 0 :(得分:2)
我不会在版本控制下的platforms
下放置任何文件。对我来说,这些目录是Cordova CLI的省份。
以下是关于版本控制应该是什么的问题:What parts of cordova cli generated projects can be safely versioned in source control?
在我正在编写的电子书示例中,有更多关于版本控制的内容:https://leanpub.com/developingwithcordovacli/read
如果您需要版本控制platforms
,我会向Cordova人员提出错误,要求他们忽略platforms
下目录中的dotfiles:https://issues.apache.org/jira/browse/CB
答案 1 :(得分:1)
@mooreds,感谢您成为唯一一位回复我的第一个Stack Overflow问题的人!但是,我自己已经解决了这个问题,并将为可能需要它的其他人分享我的解决方案......
我决定分叉Cordova CLI,分析代码并看看我是否能提出解决方案。
负责更新特定平台“www”目录的主要文件似乎位于/usr/local/lib/node_modules/cordova/src/metadata/<platform>_parser.js
,其中<platform>
是平台的名称(ios,androind等等)。< / p>
大多数文件具有相同的逻辑,因此我只会发布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
和shell.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将INTO复制到“www”文件夹,而不是“www”文件夹本身。更多排除参数可用于其他类型,例如cvs或其他版本控制文件/文件夹。
现在,运行cordova prepare
只将根目录“www”文件夹中所需的文件复制到每个平台的“www”文件夹中!
另一个很好的副作用是rsync
只复制默认情况下已更改的文件。这意味着通过源代码控制仅对您更改的文件进行签入,而不是由于完全覆盖而对WHOLE目录进行签入。 NEATO!
其他说明:
<platform>_parser.js
文件处理这个略有不同的文件,并将变量命名为略有不同。我只针对iOS和Android,所以我没有打扰其他人。-Mike