7

スクリプトを実行するために必要なカスタム (非 CPAN) モジュールをユーザーに意識させることなく、ネイティブ (非「コンパイル済み/perl2exe/...」) Perl スクリプトを配布するにはどうすればよいでしょうか?

問題は、ユーザーが必然的にスクリプトをシステムの別の場所にコピーし、スクリプトをネイティブ環境から削除すると、実行する必要のあるモジュールが見つからなくなることです。

モジュールを実際のスクリプトにコピーするだけで解決することもありますが、よりクリーンなソリューションを好みます。

更新:明確にしたほうがいいです。バックエンドで同様のモジュールを使用する一連のスクリプトを配布しています。ユーザーは Perl スクリプトの実行方法を理解していますが、「スクリプトを移動しないでください」と言うことに頼るのではなく、単純にファイルを移動できるようにしたいと思います。抵抗の少ない道。

4

6 に答える 6

6

「そんなことはやめて!」と言うのが正しいやり方です。exeファイルを移動して、プログラムが引き続き機能することを彼らが期待しないことを願っています。これも例外ではありません。

とはいえ、いくつかの選択肢があります。1 つは、実際のスクリプトへのフル パスを認識しているラッパー (pl2bat など) でスクリプトを置き換えることです。もう 1 つはPARを使用することですが、これには PAR および/または parl (PAR::Packer から) をインストールする必要があります。

于 2009-11-10T19:08:21.887 に答える
4

クライアント用に準備したスクリプトに「カスタム」モジュールが必要な場合は、モジュールを cpan にアップロードしようとしているかのように単純にパックします。次に、クライアントにパッケージを渡すと、クライアントは cpan ユーティリティを使用してスクリプトとモジュールをインストールできます。

于 2009-11-10T19:05:09.093 に答える
2

複数のコンピューターやネットワーク間でも機能する「モジュールをすべて1つの場所に配置し、アプリケーションに認識させる」の変形として、PAR::RepositoryとそれぞれPAR::Repository::Clientを確認する必要があります。(ファイルシステムまたはhttpsを介して)リポジトリに接続し、ユーザーが要求するリポジトリによって提供される任意の数のプログラム(任意のモジュールセットを使用)を実行する単一のバイナリクライアント実行可能ファイルを提供するだけです。

ユーザーが多い場合は、メンテナンスにもメリットがあります。リポジトリが提供するソフトウェアを更新するだけで、ユーザーは次にプログラムを起動したときに、システムの更新されたコードの使用を開始できます。

于 2009-11-11T09:13:31.467 に答える
2

スクリプトとともにインストーラーを配布します。インストーラーは root 権限で実行する必要があり、カスタム モジュールを標準のシステムの場所 (/usr/local/lib/perl5/site_perl など) に配置します。

私はこれを試したことはありませんが、Module::Installはこの点で役に立ちます。次のように説明されています。

スタンドアロンの拡張可能な Perl モジュール インストーラー

于 2009-11-10T19:10:33.013 に答える
0

NeXTSTEP スタイルのアプリケーションバンドルをそのまま使用できれば、非常に便利です。おそらく、バンドルを使用するプラットフォーム向けに開発しているのではないので、やり遂げる必要があります。

すべてのサポート ファイルを既知の場所に配置し、設定とライブラリにアクセスできるように、それらのファイルを実行可能ファイルに指定します。これを行う最も簡単な方法は、単純なインストーラーを使用することです。

たとえば、 というアプリの場合foo、必要なすべてのファイルを に/opt/xlyd_apps/foo、ライブラリを に/opt/xlyd_apps/foo/lib、構成を に/opt/xlyd_apps/foo/etc、というように配置します。実行可能ファイルを に入れます/opt/xlyd_apps/foo/bin

重要なことは、実行可能ファイルが/opt/xlyd_apps/fooすべての機能を検索することを認識していることを確認することです。そのため、顧客/クライアントがfooスクリプトを新しい場所に移動しても、インストールは引き続き機能します。

したがって、すべてを自己完結型で再配置可能にすることはできませんが、実際の呼び出しスクリプトを再配置可能にしました。

于 2009-11-11T07:50:47.013 に答える
-3

実際に独自の解決策を思いついたのですが、どんな評判になるのかちょっと気になります。

私は、perl スクリプトを読み取り、"use/require" ステートメントを探すスクリプトを作成しました。それらを見つけると、モジュールが標準ライブラリの一部であるかどうかをチェックし (/perl5/\d+.\d+[\d.]+/ のモジュール パスを調べます)、次の条件に応じて、use/require 行を 2 つの異なる方法で書き換えます。利用方法。

requireが見つかった場合:

{
    ... inline the entire module here...
}

使用が見つかった場合:

BEGIN {
    ... inline the entire module here...
}

useimportがある場合は、上記の直後に次のように続けます。

BEGIN { import Module ...imports seen... }

これがXS を使用するモジュールでは機能しないことは理解していますが、これで問題ありませんでした。ほとんどの場合、純粋な perl モジュールのみをサポートする必要があります。

于 2009-11-11T15:53:20.127 に答える