0

最初の背景: Rails 2.2.2 アプリにはあらゆる種類のジャンクな依存関係とカスタマイズが含まれているため、当面 2.2.2 からアップグレードすることはできません。現在の計画は、このアプリを JRuby (1.6.5) に移行し、Tomcat (6.0.23 — この特定のバージョン FWIW にはまだ関連付けられていません) で warbler (1.3.2) を使用してパッケージ化することです。

アプリのJRubyブランチがバニラアプリから大幅に逸脱しないようにしたい.ランタイム環境の不一致によって引き起こされたすべての問題を解きほぐし、修正するのにどれくらいの時間がかかるかわからない. そのため、バニラ アプリから進行中の作業をクリーンかつ簡単にマージし続けられるようにしたいと考えています。

アプリのカスタマイズされた動作の多くは、ファイルに設定されたグローバルに名前空間が設定された CONSTANT を使用して構成できenvironments/*.rbます。ただし、これらの値は、yaml 構成ファイルを使用するか、シェル環境変数を設定することでオーバーライドできます。これは主に、さまざまな開発者がさまざまな設定をカスタマイズする必要がある開発中の柔軟性のためです。このシステムはこれまでのところうまく機能しており、environments/development.rbハッキング中のカスタマイズを大幅に制御できる一方で、ファイルは比較的安定して整理されたままになっています。

JRuby に移行しても、このカスタマイズ システムを維持したいと考えています。config/web.xml.erbこれまでのところ、関連する環境変数と設定を yaml ファイルからフラグメントに変換するカスタマイズを使用しています。これにより、初期化中にJNDI コンテキスト<env-entry>を介してそれらを使用できるようになります。java:comp/envより制限された環境 (ステージングや本番環境など) では、これらの設定の多くは、属性が に設定さ<Environment>れたコンテナーのcontext.xmlファイルに対応する設定を含めることでロックダウンできます。overridefalse

ここまでは順調ですね。しかし今、初期化中に JNDI コンテキストから取得した値をグローバル名前空間 CONSTANT に変換するのに苦労しています。関連するビットの抜粋を次に示します。

構成/環境/developer.rb:

...
envset "FOO", "baz"
FOO="fail" unless defined? FOO
printf "FOO is now '%s'\n", FOO
 ...

lib/config_helper.rb:

1  include Java
2  import javax.naming.InitialContext
3  import javax.naming.NameNotFoundException
4  
5  ctx = InitialContext.new
6  
7  def envset(value_name, default_value)
8      value = nil
9      begin
10         value = ctx.lookup("java:comp/env/#{value_name}")
11     rescue NameNotFoundException => e
12         value = default_value
13     end
14     printf "setting %s to '%s'\n", value_name, value
15     eval("%Q[ #{value_name} = '#{value}' ]")
16 end

web.xml:

...
<env-entry>
    <env-entry-name>FOO</env-entry-name>
    <env-entry-value>bar</env-entry-value>
    <env-entry-type>java.lang.String</env-entry-type>
</env-entry>
...

catalina.out:

setting FOO to 'bar'
FOO is now 'fail'

もちろん、この最後の行は「FOO is now 'bar'」になると予想しています。の 14 行目でlib/config_helper.rb問題が発生しているようです。同様のコードはバニラ ルビーでは問題なく動作しましたが、ここでは Tomcat での初期化中には動作しません。

では、Tomcat での Rails の初期化中に、JNDI 環境エントリからグローバルに名前空間を持つ CONSTANT を作成するにはどうすればよいでしょうか?

4

1 に答える 1

0

経験則として、は常により良い答えがありeval()ます。15行目を次の行に置き換えると、グローバル名前空間に定数が正しく作成されます。

Object.const_set(value_name, value)

オリジナルが定数を作成していた名前空間はまだわかりませんObjectが、「グローバル」な名前空間のようです。

于 2011-12-30T00:39:35.967 に答える