2013-04-29 4 views
8

アプリケーションには、JSPを介してオンザフライで生成されたテンプレートを使用する多数のウィジェットがあります。「欠落している」テンプレートを無視するようにDojoビルドに指示する方法

フロントエンドコードでは、dojo/textプラグインを使用してフロントエンドコードに含まれています。これにより、ウィジェットのライフサイクルは、テンプレートが解決され、うまく動作するまで実行されません。

残念ながら、私たちは私たちのビルドを実行しようとすると、我々は311エラーを取得:

error(311) Missing dependency. module: app/navigation/NavigationManager; dependency: dojo/text!/author/app/templates/NavigationManager-content.html; error: Error: text resource (/author/app/templates/NavigationManager-content.html/x) missing

は、私はここで何が起きているのかを理解し、ビルドプロセスは、文字列を内部化しようとしているが、それは探しに行くときそれはそれを見つけることができず、欠けている依存としてフラグを立てます。

私はここに多くのオプションを参照してください。この欠落している依存関係を無視するように道場を教え、

どうにか
  1. - これは大丈夫だと思うが、私は警告を受けるように私は、特定のことができるようにする必要があるだろう
  2. 何とか、このテンプレートを試して内部化しないようにDojoに指示します。これは内部化するものがないため、これもうまくいきます。
  3. どういうわけか、依存関係をスタブして、依存関係の解決には合格しますが、内部化は行われません。

私は internStringsSkipList 値への参照を見てきましたが、次のどれも助けなかっ:

internStringsSkipList: ['/author/pepper/templates/NavigationManager-content.html'] 
internStringsSkipList: ['dojo/text!/author/pepper/templates/NavigationManager-content.html'] 
internStringsSkipList: ['/author/pepper/templates/NavigationManager-content.html/x'] 

任意の提案ですか?

答えて

9

私はまったく同じ問題に直面しました。そして、dojoドキュメントとソースコードをたくさん読んだ後、私はほとんど不可能であれば非常に難しいという結論に達しました。しかし、非常に簡単でエレガントな回避策があります。この問題を解決する方法を告げる前に、まず最初の場所(あなたがあなた自身の状況に解決策を調整することができます)に必要な回避策はあり:しかし、なぜ

まず問題は、リソースはによると

発見できています道場のビルドシステム Reference Guideの概要セクション:彼らは、ファイル・システム上に存在しないため、

[The build system] “discovers” a set of resources and then applies a synchronized, ordered set of resource-dependent transforms to those resources. (…) When a resource is discovered, it is tagged with one or more flags that help identify the role of that resource. (…) After a resource is discovered and tagged, the system assigns a set of transforms that are to be applied to that resource.

だから要するに、その場で生成されたすべてのリソースは、ビルドシステムによって発見することができません。それらが発見できない場合は、それらをタグ付けすることはできず、それに変換を適用することはできません。特に、resourceTagsはそのようなリソースには呼び出されず、のレイヤーを比較して、プロファイルレイヤー定義のリストに入れることはできません。ところで、私の知る限りdocumentation to depsScan transformを理解するように、internStringsSkipListのみリソースをスキップするために使用することができる

は、従来の表記法(dojo.something、例えばdojo.moduleUrl)を使用して指定されました。

第二の問題、プラグインのリゾルバは、物理ファイルを想定してい

表記dojo/text!/some/urlプラグインとしてdojo/text.jsコンポーネントを使用することを言います。私はthis ticketにこのノートを見つけた:

Every AMD plugin should have a plugin resolver in util/build/plugins and have it registered in util/build/buildControlDefault .

あなたはutil/build/plugins/text.js(例えばon Github)を確認した場合、依存関係(dojo/text!moduleInfoに格納された後、その部分が)resourcesではないので、あなたは、エラーがスローされていることがわかります配列:

textResource = bc.resources[moduleInfo.url]; 
if (!textResource){ 
    throw new Error("text resource (" + moduleInfo.url + ") missing"); 
} 

これは、「発見」段階でリソースを検出できなかったためです。

困難な解決策では困難なソリューション

、それは、またはあなたがどのように変換depsScan作品を変更する必要があり、動作しない場合があります。基本的に、depsScandojo/text!/some/urlに出会うと、プラグインリゾルバを呼び出して依存関係が存在するかどうかをチェックします。 depsScan documentationから:

depsScanのためのカスタムトランスフォームを含むように transformJobsを再定義することによって可能であるかもしれない

Once all dependencies are found, the transform ensures all dependencies exist in the discovered modules. Missing dependencies result in an error being logged to the console and the build report.

。詳細な情報については、util/build/buildControlDefault.json Github)とthis forum postを参照してください。

簡単な回避策

だけリソースをロードするために、独自のプラグインを作成します。独自のプラグインが登録されたプラグインリゾルバ(上記第二の問題を参照)を持っていないと、コンパイル時に取得しますすべてはJSONリソースをロードします。これは、このようなプラグインの私の例である恐ろしい

warn(224) A plugin dependency was encountered but there was no build-time plugin resolver.

です動的に:

それはカスタムロード機能を追加して再利用します。これはthis dojo-toolkit forum postに投稿された別の例の適応です。そのコードはJSFiddleにあります。

define(["./json!/path/to/an/json"], 
function(values){ 
    return values; 
}); 

あなたのプラグインはちょうど限り、あなたはどの(カスタムプラグインのリゾルバを指定していないとしてJSONとしてそれを解析せずにロードされたテンプレートを返す、とすることができます:私はこのようなプラグインを使用して、私のプロジェクトで

ファイルがディスク上に物理的に存在することが期待されます)、プロジェクトはうまくコンパイルされます。

+0

Amiramix、私は同じ問題を抱えており、私はあなたの答えに従うことに苦労しています。私はあなたに直接連絡してもよろしいですか? –

+0

確かに、私の個人的なウェブサイトを見つけることができます私の電子メールを見ることができます(他の手段を使って私に連絡したい場合を除きます)。 – Amiramix

0

これはあなたの問題ではありませんでしたが、error(311)問題に直面しているものと、最も一般的な解決策は、このことになるだろう:

はスラッシュとテンプレートのパスを起動しないでください。

悪い:

"dojo/text!/app/template/widget.html" 

グッド:

"dojo/text!app/template/widget.html" 

あなたのテンプレートパスは通常、プレーン老いたURLではありません。これはDojoビルドの一部であるため、Dojoビルド・パスを使用してテンプレートを取得します。

関連する問題