4

CommonJS モジュール スタイルを使用する Titanium プロジェクトがあります。ただし、コードは絶対パスを使用するため、ビルド時に絶対パスがアプリケーション ディレクトリにサンドボックス化されます。

var foo = require("/lib/module");

コマンドラインでいくつかのテストを実行し、jasmine-node を動作させたいと考えています。ただし、テストがモジュールを実行すると、モジュールの require ステートメントに上記の絶対パスが含まれます。

特定のディレクトリへの絶対必要パスを解決するためにノードを分離 (おそらく chroot) する方法はありますか? もしそうなら、どのように?

-- RepositoryRoot/
   |- app/
   |  \- Resources/
   |     |- app.js  # Has require("/lib/module1.js")
   |     \- lib/
   |        |- module1.js # Has require("/lib/module2.js")
   |        \- module2.js
   \- tests/
      \- module1.spec.js # Has require("../app/Resources/lib/module1")
                         # Or require("/lib/module1")
4

1 に答える 1

4

ここで解決策を見つけた後、私は学んだことです。上記の質問に対する簡単な答えは、それができないということです。ノードは絶対パスを絶対パスとして読み取ります。つまり、答えは、パスを絶対パスから疑似絶対(相対)パスに変更することでした。これは、このブログ投稿からの引用であり、いくつかの光を当てています。

CommonJSのTitanium実装にrequire()バグがあり、相対パスを正しくサポートしていません。これは、ジャスミンノードのテストランナーを、最小限の複雑なディレクトリツリーでさえもプロジェクトに統合しようとする場合の大きな問題です。

この問題の考えられる解決策は、Titaniumで相対パスを使用しないこと require()です(ただし、ノードを介して実行されるジャスミン仕様でそれらを自由に使用できます)。相対パスの代わりにResources、ルートディレクトリとしてフルパスを使用する必要があります。

これはNODE_PATH、ノードコマンドを実行する前に環境変数を設定することで実現されます。このようにして、 `require(" module / path ")などのパスがノードチタンによって解決されます。

いくつかの注意点があります。一部のモジュールでは、絶対パスが必要になります。この場合、循環依存関係がない限り、絶対パスをモックアウトするためにproxyquireが必要です。また、ノードにはTitanium APIがないため、TitaniumAPIをモックアウトするためのmocktiパッケージも含める必要があります。spec_helper.jsでこれを使用します。

global.Ti = require("mockti");

proxyquire = require("proxyquire");
var myModule = proxyquire("relative/path/to/MyModule", {
    "/absolute/path/to/some/module": require("absolute/path/to/some/module")
});
于 2013-02-05T10:57:30.207 に答える