1

requireたとえば、ftp_reader.rb という名前の ruby​​ ファイルをロードするために使用するとします。

require './readers/ftp_reader'

10 個のファイルに上記のrequireステートメントが含まれており、このファイルを使用しています。ftp_reader を誤って分類したとしましょう。パスは次のようになります。

require './remote_readers/ftp_reader'

ftp_reader が必要な 10 個のファイルを覚えて、パスを更新する必要があります。これは苦痛です。私は常にファイルとフォルダーの名前を変更して再配置し、プロジェクトが問題のドメイン (BDD) をできるだけ正確に表すようにしています。

require私の質問は、すべてのプロジェクト ファイルのパスを含む何らかの種類のマニフェスト ファイルを使用し、このマニフェストを使用して依存関係を見つける方法のバージョンを持つ宝石がそこにあるということです。このファイルにはファイルへのエイリアスがあり、requireステートメントではファイル パスの代わりにエイリアスを使用します。だれかが require.js を使用したことがある場合、これは非常に馴染みのあるものに聞こえるでしょう。そんなものがRubyの世界に既に存在するのでしょうか?または、この問題は Ruby の世界でどのように取り組まれているのでしょうか?

4

2 に答える 2

2

事前のコメント: あなたの願い (そして私の答え) には、醜いコードの味があります。ファイルで 1 つまたは複数の gem を検討することをお勧めします。私の答えの最後にもっと。

過去に行ったこと: 異なるフォルダーと 1 つの共通ファイルに小さなスクリプトもありましたmyscripts.rb。これmyscripts.rbは、ほとんどのファイルの先頭にロードされ、ロード パスを設定します。

require_relative '../myscripts.rb' #
require 'ftp_reader'

myscripts.rbは次のように定義されました。

$:.unshift('c:/<..full_path..>/readers/')
$:.unshift('c:/<..full_path..>/writters/')
#... more pathes ...

フォルダー構造を変更したときは、以下を変更するだけで済みますmyscripts.rb

$:.unshift('c:/<..full_path..>/remote_readers/')

myscripts.rb場所を変更したことがないため、すべてのスクリプトで新しいフォルダー構造が使用されるようになりました。

相対パスはメイン ファイルに対してではなく、myscripts.rb.

私への相対パスを組み合わせて使用​​する__FILE__可能性がありますが、私はそれを使用しませんでした。expand_pathmyscripts.rb

問題: スクリプトの名前を変更すると、これが機能しません (多くの場合、古いスクリプト名を保持し、新しいスクリプト名をロードしました)。また、古いバージョンでは柔軟性がありませんでした。

その後、1 つの gem を作成mytoolsし、すべてのスクリプトをこの gem に追加しました。古いバージョンが必要な場合は、古いバージョンをロードすることができました。

今日、私は懸念/トピックごとに宝石を作成します。gem に含まれるファイルの数は問題ではありません。宝石は私の問題を解決してくれます。ファイルの数は重要ではありませんが、懸念事項の分離が重要です。gem には、問題を解決するためのスクリプトとテストが含まれており、ドキュメントのベースとなります。

于 2012-12-09T19:37:54.850 に答える
0

ほとんどの人は、Ruby のバンドル マネージャーを使用して依存関係管理の問題に取り組んでいます。Rails に含まれているので、Bundler は最大のものです。使用するすべてのバンドルを指定する Gemfile を作成すると、bundler がバンドルの独自のリポジトリを作成し、必要に応じてそれらを要求することができます。サーバーサイド JavaScript を実行する場合、npm と非常によく似ています。

于 2012-12-09T17:46:13.240 に答える