@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.rm
しshell.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 に提出することを気にしませんでした。今は方法も時間もないからです。ここにたどり着いた解決策を共有することで、失ったカルマ ポイントが相殺されることを願っています。
-マイク