3

在我的正常工作流程中,我正在管理 Cordova 项目的根“www”文件夹中的所有代码。当我准备好部署到一个或多个设备时,我运行 Cordova“cordova prepare”命令,据我所知,它只是将必要的资产复制到每个平台的各自文件夹中。

执行此操作时,该命令会干扰 SVN 并从源代码管理中删除平台的“www”目录。我假设这意味着该命令会删除此文件夹中的所有内容并替换为根“www”内容,从而删除管理源代码控制信息的“.svn”文件夹。

有谁知道我可以如何防止这种情况发生?我听说过并阅读了一些有关 Cordova “钩子”功能的信息,但对它的工作原理以及如何完成“钩子”以实现我的目标一无所知。

4

2 回答 2

2

我不会将任何文件platforms置于版本控制之下。对我来说,这些目录是 Cordova CLI 的省。

这里有一个关于什么应该进行版本控制的问题:cordova cli 生成的项目的哪些部分可以在源代码控制中安全地进行版本控制?

在我正在编写的电子书示例中,还有更多关于版本控制的内容:https ://leanpub.com/developingwithcordovacli/read

如果您必须进行版本控制,我会向 Cordova 人员提交一个错误,要求他们忽略以下目录中的点文件:httpsplatforms : //issues.apache.org/jira/browse/CBplatforms

于 2013-09-16T19:00:30.257 回答
1

@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.rmandshell.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,因为我现在不知道如何也没有时间。希望分享我来到这里的解决方案能够平衡我失去的业力点数。

-麦克风

于 2013-09-19T01:01:17.960 回答