12

CPANモジュールのソースを分析すると、次のようになります。

...
package # hide from PAUSE
   Try::Tiny::ScopeGuard;
...

明らかに、それはから取られていますが、他のモジュールのキーワードとパッケージ識別子 の間Try::Tinyにもこの種のコメントがあります。package

なぜこの手順が使用されるのですか?その目標は何ですか、そしてそれはどのような利点がありますか?

4

2 に答える 2

22

確かに、PAUSEのインデクサーからパッケージを隠すのはハックです。

ディストリビューションがPAUSEにアップロードされると、インデクサーはアップロード内の各ファイルを調べて、ディストリビューションに含まれているパッケージの名前を探します。インデックスに登録されたパッケージは、CPANの検索結果に表示されます。

インデクサーにパッケージを検出させたくない理由はたくさんあります。ディストリビューションには、モジュールの検索結果を乱雑にする小さなパッケージや重要でないパッケージが多数含まれている場合があります。t(テスト)ディレクトリまたはその他の非標準ディレクトリに、ディストリビューションの一部としてインストールすることを意図していないパッケージが定義されている場合があります。ディストリビューションには、(他の誰かが書いた)完全に異なるディストリビューションのファイルが含まれている場合があります。

packageインデクサーが同じ行のパッケージ名のように見えるキーワードと式を厳密に検索するため、ハックは機能します。

現在、META.ymlディストリビューションにファイルを含めることができます。no_indexPAUSEインデクサーは、このファイルの仕様を探して尊重します。ただし、これはインデクサーの比較的新しい機能であるため、古いモジュールや古いCPANコントリビューターは引き続き改行ハックを使用します。

no_indexこれがからのスペックの例ですForks::Super

no_index:
    directory:
        - t
        - inc
    package:
        - Sys::CpuAffinity
        - Signals::XSIG
        - Signals::XSIG::Default
        - Signals::XSIG::TieArray56

Sys::CpuAffinityおよびSignals::XSIGは個別のディストリビューションであり、。も一緒にパッケージ化されていForks::Superます。一部のテストスクリプトには、インデックス付けしてはならないpackage宣言(たとえば)が含まれています。Arbitrary::Test::Package

于 2012-06-06T21:15:12.917 に答える
-3

さて、これがこの現象の別のショットです...私はPerlを12年間ハッキングしてきましたが、このパワフルなハッキングはめったに見られず、おそらく単に無視され、調査する必要はありませんでした。ただし、明確なことが1つあります。古き良きPerl'n'UNIXの考え方で作成された、ハック的な処理がPAUSEで行われています。これは、疑いの余地なく行指向のテキスト解析を伴うため、Perlファイルを解析しますgrep。それよりもperlそれ自体、知っている人は、パッケージ名を抽出してから、いくつかの手順を開始するか、いくつかの統計情報などを取得します。そして、この手順を実行して、作成者がパッケージ宣言を2行に分割する方法をハックして、ハッキーpacky grepジョブに、パッケージがすぐ下に宣言されているという手がかりがなく、プログラマーがハッキースキルに満足しているようにします。そして、PAUSE統計、またはそれらが一緒にコブリングしているものはすべて、本来あるべき状態です。それは理にかなっていますか?

于 2012-06-06T21:14:01.713 に答える