2011-12-06 9 views
0

私はMarkLogicパイプラインをデバッグしようとしています。パイプラインで使用されているxqueryファイルの1つを変更するたびに、手作りのスクリプトを実行してすべてのシステムモジュールをリロードしなければなりません。私はこれがプロジェクトがいくつかのモジュールしか持っていなかったときに開発されたテクニックだと思っていますが、今はこのプロセスに数分かかります。私が必要とするのは、1)私が変更した1つのモジュールだけをリロードするより速い手法です。 CQで実行できるコードスニペット、または2)まったく異なるアプローチです。ありがとう。MarkLogicのテンプレートデバッグ:生産性を向上させる方法は?

答えて

2

通常、ファイルシステムから直接コードを実行できますが、パイプラインでは機能しません。

2番目に簡単なのは、webdavアプリケーションサーバーとwebdav対応のエディタ(oXygenなど)を使用することです。 webdavタイプの新しいアプリケーションサーバーを作成し、アクセスするモジュールデータベースに接続し、ログインするアカウントがあることを確認したら、準備が整いました。

他のアプローチでは、よりスマートなシステムを使用して、変更されたファイルのみをアップロードしています。 Antは通常、変更を検出するのに非常に優れています。そして、github(https://github.com/garyvidal/marklogic-ant-tasks)に利用可能なMarkLogic Antタスクがあります。確かにそれは本当にうまく動作しますが、あなたは試してみる必要があります。ビルドスクリプトをうまく考える必要があるかもしれません。私が最後に使った時、間違いなく数百のファイルをロードしたにもかかわらず、かなり分かりました。

なぜアプローチが非常に遅いのかは別の理由があります。あなたがそれを公開することができれば、具体的な最適化のヒントを求めることができます。

+0

WebDAVを介して接続すると、モジュールのキャッシュをダンプする(またはコンパイルするのは何か)問題を解決するにはどうすればよいですか?ありがとう! – bethesdaboys

+0

私の知る限りでは、モジュールは最初のアクセス(初期または更新後)でコンパイルおよびキャッシュされます。 AFAIKの更新を遅くすべきではありません。その動作は、モジュールを更新するために使用するすべての方法で同じですので、WEBDAVのモジュールデータベースへのアップロードは異なりません。 – grtjn

1

「すべてのシステムモジュール」をリロードする必要があると少し混乱します。おそらく、最新のサーバーリリースを試すか、サポートに確認する必要がありますか?

しかし、あなたは単にあなた自身のコードをリロードしたいと仮定すると、あなたはRecordLoaderを使用することができます:あなたは、むしろCQを使用する場合は、あなたが http://developer.marklogic.com/pubs/4.2/apidocs/AdminBuiltins.html#xdmp:filesystem-directoryで始めることができ https://github.com/marklogic/recordloader

- これはあなたが始められるかもしれません。おそらくdoc-insert呼び出しにドキュメントのアクセス許可を追加する必要があり、URIを構築するにはさらに文字列を操作する必要があります。 Marklogic Antタスクでの技術とXCC接続(任意のdoesntのは、あなたのデータベースを指すように持っている)を使用して

declare namespace dir="http://marklogic.com/xdmp/directory"; 

if (xdmp:database('Modules') eq xdmp:database()) then() 
else error(
(), 'INSTALL-NOTMODULES', text { 
    xdmp:database-name(xdmp:database()), 'is not the Modules database' }) 
, 
for $i in xdmp:filesystem-directory('/path/to/files')/dir:entry 
    [dir:type eq 'file'] 
    [ends-with(dir:filename, '.xqy')] 
let $uri := $i/filename/string() 
return xdmp:document-insert($uri, xdmp:document-get($i/dir:pathname)) 
+0

申し訳ありませんが、私の投稿は明確ではありません。 2つのxqyファイルを扱っています.MLは単にファイルをファイルシステムからdbに再挿入する必要がありますか?私はRecordLoaderを見ていきます。小さな工具を使用した非常に古風な開発環境のように感じることによって、私は挫折し続けます...私は逃げます。私はCQの代わりにOxygenを使うので、少なくとも私はシンタックスカラーハイライトを得ることができます。再度、感謝します。 – bethesdaboys

+0

私の心に本当の疑問は、いくつかのxqyファイルを修正してすぐに結果を見ることができる理由だと思います。明らかにパイプラインに触れられているxqyファイルでは、これは機能しません - そして、私はそれを解決するために正確に何をしなければならないかについてはっきりしていません。 – bethesdaboys

+0

CPFパイプラインはトリガーによって実装され、CPFトリガーはモジュールルートをモジュールデータベースに設定して評価されます。したがって、トリガーが使用するコードをインストールする通常の方法は、それをModulesデータベースにコピーすることです。一方、アプリケーションサーバーは、ルートとしてファイルシステムの場所を使用できます。 1つの選択肢は、/ opt/MarkLogic/Modules(Linuxでは - 他の環境は異なる)を使用することです。そのファイルシステムの場所にあるモジュールは普遍的に利用可能です。 – mblakele

1

:ここ あなたが使用することができますhttps://github.com/garyvidal/marklogic-ant-tasks

はあなたのテンプレートで使用できるものです。

<!--Define ml namespace in project root element--> 
<project name="ML Build Task" xmlns:ml="http://www.marklogic.com/ant"> 
> 
<!--Set you the classpath to where your mlant.jar file is located. 
    Include any other dependent jar files required to execute tasks 
    noted in Dependencies section. 
--> 
<path id="mlant-classpath"> 
    <fileset dir="${lib-dir}"> 
      <include name="xcc.jar" /> 
      <include name="mlant.jar" /> 
      <include name="corb.jar"/> 
      <include name="saxon9he.jar"/> 
      <include name="xqdoc-ml.jar"/> 
      <include name="antlr-2.7.5.jar"/> 
    </fileset> 
</path> 
<!-- 
    Setup the type definition and assign classpathref to mlant-classpath 
--> 
<typedef 
    uri="http://www.marklogic.com/ant" 
    resource="com/marklogic/ant/antlib.xml" 
    classpathref="mlant-classpath" 
/> 
<!--Optional: Set the property for xccstring used to connect to MarkLogic database--> 
<property name="xccstring" value="xcc://test:[email protected]:9090/Docs"> 

<!--Create a target element and use the tasks--> 
<target name="load-modified"> 
    <ml:load xccurl="${xccstring}"> 
      <ml:docset destdir="/app-code/"> 
       <ml:permissionset> 
        <ml:permission role="nobody" permission="execute" /> 
        <ml:permission role="nobody" permission="insert" /> 
        <ml:permission role="nobody" permission="read" /> 
        <ml:permission role="nobody" permission="update" /> 
       </ml:permissionset> 
       <ml:collectionset> 
        <ml:collection name="collection1" /> 
        <ml:collection name="collection2" /> 
       </ml:collectionset> 
       <fileset dir="../src" includes="**/*" > 
       <modified/> 
       </fileset>     
      </ml:docset> 
     </ml:load> 
</target> 

<!--Have Fun--> 
</project> 
0

モジュールのアップロードを高速化する場合は、モジュールデータベースを消去し、「ディレクトリの作成:自動」をオフにして、複数のスレッドが設定されたRecordLoaderのようなものを使用します。ディレクトリ作成をモジュールデータベースへの自動書き込みに設定しないと、ロック競合が発生し、事実上シングルスレッドになります。

関連する問題