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

バージョン管理が必要な場合はplatforms、Cordova 関係者にバグを報告して、次のディレクトリにあるドットファイルを無視するよう依頼しますplatforms: https://issues.apache.org/jira/browse/CB

于 2013-09-16T19:00:30.257 に答える
1

@mooreds、私の最初のスタック オーバーフローの質問に唯一回答してくれてありがとう! ただし、私はこの問題を自分で解決したので、それを必要とする他の人のために私の解決策を共有します...

私は、Cordova CLI をフォークし、コードを分析して、解決策を思いつくことができるかどうかを確認することにしました。

特定のプラットフォームの「www」ディレクトリの更新を担当するプライマリ ファイルは、プラットフォームの名前 (ios、androind など) にあるようです/usr/local/lib/node_modules/cordova/src/metadata/<platform>_parser.js<platform>

ほとんどのファイルは同じロジックを持っているので、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();
        }
    });
}

2 番目の部分は、そのupdate_wwwすぐ上のメソッド内にあります。この方法では、 と を使用shell.rmshell.cpて「www」ディレクトリ全体を削除し、ルートの「www」ディレクトリをプロジェクト フォルダにコピーします。もちろん、これの問題は、すべての .svn フォルダーと "www" フォルダーが削除されることです。

この問題を解決するには、 と入力しrsyncます。rsync を使用すると、はるかに堅牢なレベルでファイルをコピーできます。この場合、パスを除外できます。そこで、次の 2 行を 1 つの操作に変更しました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" + "/ "ます。これは、「www」フォルダー自体ではなく、「www」フォルダーにコピーするように rsync に指示します。cvs やその他のバージョン管理ファイル/フォルダーなど、その他のタイプにはさらに除外パラメーターを使用できます。

これで、実行cordova prepareすると、必要なファイルのみがルートの「www」フォルダーから各プラットフォームの「www」フォルダーにコピーされます。

もう 1 つの優れた副作用はrsync、デフォルトで変更されたファイルのみをコピーすることです。これは、完全に上書きされるため、ディレクトリ全体ではなく、変更したファイルに対してのみソース管理を介してチェックインが行われることを意味します。ネイト!

その他の注意事項:

  • <platform>_parser.jsファイルはこれをわずかに異なる方法で処理し、変数の名前も少し異なります。私は iOS と Android のみをターゲットにしているので、他は気にしませんでした。
  • いいえ、私はコードを Cordova に提出することを気にしませんでした。今は方法も時間もないからです。ここにたどり着いた解決策を共有することで、失ったカルマ ポイントが相殺されることを願っています。

-マイク

于 2013-09-19T01:01:17.960 に答える