Cordova准备/构建从源代码管理(SVN)解除绑定WWW文件夹

时间:2013-09-14 18:02:38

标签: svn version-control cordova

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

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

有谁知道如何防止这种情况发生?我已经听过并读过一些关于Cordova“钩子”功能的内容,但是有一丝线索可以说明它是如何工作的,也不知道如何实现“钩子”以实现我的目标。

2 个答案:

答案 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.rmshell.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,所以我没有打扰其他人。
  • 不,我没有费心将代码提交给Cordova,因为我现在不知道怎么也没有时间。希望分享我来到这里的解决方案将平衡我失去的业力点。

-Mike