2010-11-23 6 views
2

大部分はフラット(キー/値のペア)ですが、XML、bashスクリプト、カスタムフォーマットのうちのいくつかは、構成ファイルのツリーを簡潔に比較したいと思います。設定情報はほとんどの場合、順序付けされておらず、空白とコメントを含むことができます。簡潔に構成ツリーを比較して部分的にマージする

フラットファイルの場合、空白なしのdiffや並べ替えられた出力のコメントは、私がしたいことに非常に近いものになります。 XMLの場合、sometoolsavailableがあります。しかし、いくつかのカスタムフォーマットは、例えば、ネストされた構成。キーの順序は重要ではなく、サブキーの順序は重要ではありませんが、ツリー構造は(XMLによく似ています)です。他は非常にオーダー依存です。

頻繁に行う必要がある場合は、これをどうやってやりますか?十分一般的なツールはありますか?自分のソリューションを展開するのはどうですか?フォーマットの数は莫大ではありません(確かに/ etcと同じくらい悪くはありません)。デフォルトはフラットです - おそらくlibmagicとファイル名の一致、カスタムパーサーとの組み合わせでしょうか?誰もそれを試したことがありますか?

ネストされているが順序付けられていない構造を持つファイルに対して、適切なジョブを実行し、既存のツールで他のいくつかの種類を特別に扱うことによって、95%の問題を解決する方法があります。シンプルなネストされたファイルに対するほとんどの作品のアプローチを提案できますか?

いくつかの例:

com.example.resource.port=8080 
com.example.resource.host=bar 
//com.example.network.timeout=600 
com.example.network.timeout=300 

VS

com.example.resource.host=foo 
com.example.resource.port=8080 

< com.example.resource.host=foo 
--- 
> com.example.resource.host=bar 
> //com.example.network.timeout=600 
> com.example.network.timeout=300 

又は随意を生成しなければならない:

< com.example.resource.host=foo 
--- 
> com.example.resource.host=bar 
> com.example.network.timeout=300 

と思われます。しかし、のようなものは:

Conf com.example.resource = 
    Conf host = foo; 
    Conf port = 8080; 
; 

Conf com.example.resource = 
    Conf port = 8080; 
    Conf host = bar; 
; 
Conf com.example.network = 
    Conf timeout = 300; 
; 

でも動作するはずです:

<  Conf host = foo 
--- 
>  Conf host = bar 
> Conf com.example.network = 
>  Conf timeout = 300; 
> ; 

答えて

1

コンフィギュレーションファイルのそれぞれには、構文と暗黙の意味を持っています。あなたがやりたいことは、設定ファイルをテキストではなく暗示的なセマンティクスで比較することです。

これを実行する唯一の方法は、各構成ファイルの種類ごとにカスタムパーサーがあることです。次に、暗黙のセマンティクスに従ってファイルを比較する必要があります。

一般的に、これは実際のプログラミング言語にとって確かに難しいことです。正確な言語構文に従ってコードを解析し、言語構造(例えば、式、ステートメント、宣言、メソッドなど)に従ってそれらを比較し、相違を抽象的な編集操作として報告する、妥協の解決策を提供します。 、コピー、削除、挿入、名前変更、ブロック内の識別子)。これはdiffの典型的な "何となくこの行のブロックが変わった"という意味ではなく、プログラマーにとって理にかなった補足的なデルタ(あなたが求めているもの)を与えます。

これらのツールは言語の構文を認識しており、小文字のの意味を知っています。特に、 ののコミットメントの要素を扱うために、私たちは全部ではありません。 Javaでは、クラス内のメソッドの順序は重要ではありません。あなたの場合、いくつかの構成要素の順序は重要ではないようです。私たちの機械はこれを考慮に入れることができます。

これを行うにはあなたはとしたいと思います。設定ファイルの種類ごとに別々のパーサーが必要で、安全にコマンドをシャッフルすることができるときは、それぞれの種類について個別の知識が必要です。これを行うには、構成ファイルの種類ごとに個別のツールが必要です。 (XMLベースのファイルで、セマンティクスと構文を区別しようとしているため、セパレータツールが必要です)。私の考える理想的なソリューションは、それぞれの設定ファイルタイプのSmartDifferencersです。

関連する問題