2

ソースコードリポジトリのlibディレクトリに保持されているモジュールを使用できるようにしたいのですが、開発者が作成しているスクリプトを使用するための唯一の前提条件は、標準のPerlインストールを使用することです。これを達成する方法がわからない。

私のスクリプトでは、

use FindBin qw($Bin);
use lib "$Bin/lib"; # store non standard modules here
use Term::ANSIColor;
use Win32::Console::ANSI;
print Term::ANSIColor::colored("this should be in color\n", "bold red");

モジュールを./libに配置します。それがモジュールが存在する実際の場所であることを確認しました(名前を変更して失敗させることにより)。ただし、モジュールが任意のlibディレクトリにある場合でも、ppmがモジュールを認識する必要があるようです。

最初にppmで「インストール」されない限り、スクリプトでlib内でスクリプトを検索/使用することはできません。これを回避する方法があるはずだと思います。

これは非定型のリクエストかもしれませんが、私の目標はおそらく非定型です。開発者にチェックアウトを実行して、追加のコマンドを実行したりパッケージマネージャーを使用したりせずに、すぐにいくつかのスクリプトを使用してもらいたいだけです。

洞察をありがとう。

編集:私は完全な例で更新しました。また、ppmを介してアンインストールすると(ただし、pmは参照ディレクトリに残しておく)、構文を変更する必要がある可能性があることにも気付きました。以前はそれを考慮していませんでした。したがって、フルパスを指定するか、jheddingsやBipedalSharkプロポーザルのようにrequireを使用する必要があります(つまり、「インストール」されていない場合は、「require」を使用して「.pm」を追加するか、BEGINブロックを使用する必要があります。

この場合、正しい構文が見つかりません。

編集2:以下のコメントに基づいて、私は欠陥のある仮定を持っている可能性があることを認識しています。私の理由は次のとおりです。実際のコード「.pm」を直接参照すると、パッケージマネージャーを使用せずに使用できるはずです。そうではないかもしれませんし、それをやりたいのなら、別の方法でやらなければならないかもしれません。または、「。pm」のコードをリファクタリングする必要がある場合があります。

編集3:私はいくつかのことを誤解していたと思います。IDEのエラーメッセージ「Compilationfailedinrequire」、モジュールを含めるために使用していた行の強調表示、および「モジュールWin32 :: Console::ANSIのロード可能なオブジェクトが見つかりません」というコンソールエラーメッセージ

モジュール自体のロードに関する問題として読んでいましたが、モジュール自体がロードしようとしていることに起因する問題のようです。興味深いことに、私はppmインストールを使用しなかったので、これは問題にすぎません。

実際のモジュールを見つけています。トラブルラインをコメントアウトすることで確認できました。

助けてくれてありがとう、でももう少し時間をかけなければならない。

4

5 に答える 5

3

「モジュールのロード可能なオブジェクトが見つかりません...」のperldocperldiagを参照してください。

    (F) The module you loaded is trying to load an external library,
    like for example, "foo.so" or "bar.dll", but the DynaLoader module
    was unable to locate this library.  See DynaLoader.

この問題は、モジュールがロードしようとしているものから発生していることは正しいです。これがDynaloaderの機能です。ただし、Win32 :: Console :: ANSIのドキュメントには、外部ライブラリの要件については記載されていません。

于 2009-11-15T07:08:44.917 に答える
2

ディレクトリ内のモジュールパス構造を保持していますlibか?
つまり、モジュールはパスにある必要があります$Bin/lib/Some/Module.pm

于 2009-11-15T00:51:30.613 に答える
2

perlfaq8の回答から、プログラムが存在するディレクトリをモジュール/ライブラリの検索パスに追加するにはどうすればよいですか?

あなたはそれを正しくやっているように見えますが、助けを期待するならもっと私たちに与える必要があります。

そのスクリプトを実行すると、最終的に何になり@INCますか?次のようなデバッグ行を入力します。

 BEGIN {
      use lib ...;
      print "INC is \@INC\n"; 
      }

その出力が期待するディレクトリを示していることを確認してください。そうでない場合は、そこから問題の二等分を開始します。

于 2009-11-15T03:44:47.357 に答える
1

これを試して:

BEGIN {
    use FindBin qw($Bin);
}
use lib "$Bin/lib"; # store non standard modules here
于 2010-09-20T23:14:04.593 に答える
0

いつも手動でモジュールをインストールしていますが、動作しているようです。ディレクトリとファイルをある場所にコピーし、あなたが示したように「uselib」ディレクティブを使用します。ファイルを見逃して、特定のファイルを探しているというランタイムエラーが発生することがあります。インターネットでファイルを見つけて適切な場所に配置すると、機能します。セットアップで何が起こっているのかわからない。これは機能するはずです。

私は通常、perlモジュールをスクリプトと同じディレクトリに配置してから、lib"。"を使用します。しかし、それが問題になるかどうかはわかりません。

于 2009-11-15T02:17:14.140 に答える