2016-07-06 13 views
1

私はrubygemsコードを少し掘り下げましたが、Gem::ConflictErrorがあってもそれを投げないようにする組み込みの方法があるようには見えません。開発中に私は、紛争が起こっているコードに触れないことがわかっているものをテストしたいと思っているかもしれません。あるいは、以前の矛盾した宝石のどのバージョンでも問題を引き起こさないことを知っています。私はテストしたいものをテストするだけでいいですし、バージョンの競合については後で心配します。ruby​​gemsに宝石のバージョンの競合を無視させることはできますか?

私はこれを行うためにrubygemsをハックすることができます知っています。私はそれをやり遂げるために考えたり、複数の方法で考えることができます。誰かがすでにこれをやっているのか、どうやってやったのか、もしそのコードがどこかで共有されているのであれば私はちょっと好奇心が強い。私はこれがなぜ開発ツールとしてのRubygemsに組み込まれていないのか、ちょっと不思議です。

+0

多分[this](http://stackoverflow.com/questions/16741935/how-to-tell-bundler-to-ignore-gems-that-dont-exist#ex741578)はあなたに 'require: Gemfile内の各gemの「false」パラメータを指定します。 – AxelWass

答えて

2

何かを行う前にバージョンの競合を心配する必要があります。 Rubyには単一のルート名前空間があり、すべての依存関係がそこにロードされるので、同じ宝石の複数のバージョンを読み込むことは一般に不可能です。 Node.js用のNPMのような他のシステムはかなり柔軟性があり、同時にいくつのバージョンもロードすることができます。それに慣れていれば、期待を調整する必要があります。

テストを行い、競合を回避したい場合は、gemの要件をGemfileから一時的に削除してください。

最終的には、修正する必要があります。回避する方法はありませんが、いつでも必要なものを選択することができます。あなたは本当にあなたが何をしているかわかっている場合

+1

合意。コンフリクトが最前線かどうかを判断し、悪い前提に基づいて多くのコードを書いたり、物事を所定の位置に固定したり、逆戻りすることをさらに困難にしたりするのが良いでしょう。 –

+0

複数のバージョンのコードをロードすることは完全に可能です。 RubyGemsがそれを管理しようとしているという事実は、Rubyの本質的ではない補助的なものです。いくつかの状況ではお勧めできませんが、やりにくいことはありません。最終的にはい、紛争を解決する必要があることを暗示しました(したがって、「開発中...」)。ポイントは時々あなたの頭の中に**今すぐ**対処したいことがあり、すべてを忘れて**あなたが知っている紛争を解決しなければならないということです** **は、今**はちょうど反生産的です。だから、私はここで同意しない。 – Huliax

+0

まず、*理論的に*できているからといって実際に行うのは実際には意味がありません。適切にコード化された宝石は、名前を変更しても生き残ることができる。多くの人は、指定された名前空間を管理していると仮定しているからではありません。 2つの異なるバージョンの宝石が同時にロードされると、競合が起こり、RubyコアにバンドルされたYAMLパーサーとgemバージョンが何度も何度も繰り返されているので、乱雑になることがあります。これはRubyの世界では非常に厄介な問題です。 – tadman

0

、これを試してみてください。

export NOEXEC_DISABLE=1 
ruby you-program.rb 

この環境変数が検索を無効にし、Gemfilesと宝石のバージョンをチェックします。

+0

少し重い手...しかし、私はそれが好きです!次回私が必要な時に試してみましょう。 – Huliax

関連する問題