none
connectionStrings(web.config)と分散開発 RRS feed

  • 質問

  • お世話になっております。

    ASP.NET2.0 VS2005で開発を行なっているのですが、複数の人数で開発を行なう場合、DBのアクセス(接続文字列)など各開発環境で異なることもあると思うのですが、この場合の最適な方法はあるのでしょうか。VS22003では、user.configファイルを各開発環境で利用できることの記載は有るのですが。。。。

     

    ご教授ください。

    2007年3月14日 2:29

回答

  •  OTAKA さんからの引用

    複数の人数で開発を行なう場合、DBのアクセス(接続文字列)など各開発環境で異なることもあると思うのですが、

    この場合の最適な方法はあるのでしょうか。 

     
    私は個人で開発をおこなっていますが、リリース先と開発時でデータベースサーバが異なるので、接続文字列は、
     
    web.config
      <connectionStrings configSource="connection.config"/>
     
    connection.config (local)
    <?xml version="1.0" encoding="utf-8"?>
    <connectionStrings>
      <add name="ConnectionString"
          connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\filename.mdf;... />
    </connectionStrings>
     
    と、2つのファイルに分割し、connection.config はアップロードしないようにしています。
    (リリース先には、リリース先用の接続文字列を使用した connection.config が置いてあります。
     
    開発者が複数の場合でも、外部ファイルにしておけば個々人でそのファイルを管理すればよいかと思います。
     
     
    --以下追記
     
    .NET 1.1 環境で FileSectionHandler を利用されていたようなので追記しておきます。
    .NET 2.0 環境でも FileSectionHandler は使用できますが、ConnectionStrings セクションは別の専用のセクションハンドラを利用しているため、外部ファイルの指定はできないようになっています。
    ただし、.NET 2.0 から構成ファイルのすべての XML Element に対して configSource 属性が指定できるようになっており、外部ファイルの取り込みをサポートしています。
     
    FileSectionHandler と configSource の機能の大きな違いとして、FileSectionHandler は「外部ファイルの設定を追加する」という機能であるのに対し、configSource は「外部ファイルで XML Element を定義する」という指定であるという点です。
     
    <section file="external" anyAttr="value">
      <add key="key1" value="value1" />
    </section>
     
    という記述は許され、この場合、external ファイルが存在してもしなくても key1 は section に含まれますし、anyAttr の設定も有効です。しかし、
     
    <section configSource="external" anyAttr="value">
      <add key="key1" value="value1" />
    </section>
     
    という記述は許されていません。configSource を指定した場合、該当の XML Element では configSource 以外の指定をすることができません。からなず、
     
    <section configSource="external" />
     
    と、属性および子要素を含めないものとし、
     
    <section anyAttr="value">
      <add key="key1" value="value1" />
    </section>
     
    と、外部ファイルで属性および子要素を定義する必要があります。
    このため、FileSectionHandler と異なり、外部ファイルが存在しない場合は構成ファイルの読み込みエラーになります。
     
    2007年3月14日 19:14

すべての返信

  • 申し訳ありませんが、回答ではありません。

    それぞれの環境でweb.configをVisual Studio のウィザードや手を使って書き換えるのそんなに手間なのでしょうか。

    「user.configファイルを各開発環境で利用できることの記載」ってどこにある記載のことでしょうか。
    最後の文がよく分かりません、VS2003で利用できたものがVS2005では使えないとお考えということですか。もしそうなら何が根拠なのでしょうか。
    また、各開発環境で同じ様にすることができない事情・状況を詳しく知りたいです。

    2007年3月14日 3:55
  • つまり、web.configは、運用環境のものをソースコード管理にて保守しておき、各自はuser.configを作成し運用と異なる箇所を書き換えることで開発が行えるようになると思われます。

    VS2003では利用できたというのは、web.configに、

    <appSettings file="user.config">
      <add key="ConnectionString" value="Data Source=(local);Initial Catalog=data;user=login1;password=pass1" />
    </appSettings>
    上記のようにappSettings要素の場合に設定を上書きするfileという属性で、user.configを指定して下記の用にuser.configを作成しておけばよかったのではと思われます。
    <?xml version="1.0" encoding="utf-8" ?>
    <appSettings>
      <add key="ConnectionString" value="Data Source=(local)\test;Initial Catalog=data;user=login2;password=pass2" />
    </appSettings>
     
    しかし、VS2005からは、  <connectionStrings>の要素が新しく追加されたので、どうしたものかと迷っているのですが。。。
     
    書き換えるのが手間かといわれるそうでは内のでしょうが、運用環境の設定ファイルを誤って修正などされないために、慎重にしたいとおもっているのですが。。。
    2007年3月14日 4:15
  •  OTAKA さんからの引用

    複数の人数で開発を行なう場合、DBのアクセス(接続文字列)など各開発環境で異なることもあると思うのですが、

    この場合の最適な方法はあるのでしょうか。 

     
    私は個人で開発をおこなっていますが、リリース先と開発時でデータベースサーバが異なるので、接続文字列は、
     
    web.config
      <connectionStrings configSource="connection.config"/>
     
    connection.config (local)
    <?xml version="1.0" encoding="utf-8"?>
    <connectionStrings>
      <add name="ConnectionString"
          connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\filename.mdf;... />
    </connectionStrings>
     
    と、2つのファイルに分割し、connection.config はアップロードしないようにしています。
    (リリース先には、リリース先用の接続文字列を使用した connection.config が置いてあります。
     
    開発者が複数の場合でも、外部ファイルにしておけば個々人でそのファイルを管理すればよいかと思います。
     
     
    --以下追記
     
    .NET 1.1 環境で FileSectionHandler を利用されていたようなので追記しておきます。
    .NET 2.0 環境でも FileSectionHandler は使用できますが、ConnectionStrings セクションは別の専用のセクションハンドラを利用しているため、外部ファイルの指定はできないようになっています。
    ただし、.NET 2.0 から構成ファイルのすべての XML Element に対して configSource 属性が指定できるようになっており、外部ファイルの取り込みをサポートしています。
     
    FileSectionHandler と configSource の機能の大きな違いとして、FileSectionHandler は「外部ファイルの設定を追加する」という機能であるのに対し、configSource は「外部ファイルで XML Element を定義する」という指定であるという点です。
     
    <section file="external" anyAttr="value">
      <add key="key1" value="value1" />
    </section>
     
    という記述は許され、この場合、external ファイルが存在してもしなくても key1 は section に含まれますし、anyAttr の設定も有効です。しかし、
     
    <section configSource="external" anyAttr="value">
      <add key="key1" value="value1" />
    </section>
     
    という記述は許されていません。configSource を指定した場合、該当の XML Element では configSource 以外の指定をすることができません。からなず、
     
    <section configSource="external" />
     
    と、属性および子要素を含めないものとし、
     
    <section anyAttr="value">
      <add key="key1" value="value1" />
    </section>
     
    と、外部ファイルで属性および子要素を定義する必要があります。
    このため、FileSectionHandler と異なり、外部ファイルが存在しない場合は構成ファイルの読み込みエラーになります。
     
    2007年3月14日 19:14
  • ご返事ありがとうございます。

    「--以下追記」で記述されているところで、悩んでいました。

      <connectionStrings configSource="connection.config"/>のconnection.configファイルがなければエラーとなるし、  <connectionStrings configSource="connection.config"><add name= ・・・・ "/> </connectionStrings>でもエラーとなるので。。。
    結局connection.configをソースコード管理に含める必要があるのですね。
     
    詳細な説明ありがとうございました。F
    ※FileSectionHandler のような機能であればよかったのですが。。。
    2007年3月15日 0:31
  •  OTAKA さんからの引用
    ※FileSectionHandler のような機能であればよかったのですが。。。
     
    FileSectionHandler は key/value の組み合わせによる辞書の作成のみをサポートしていますが、構成ファイルはすべてがそのような構造になっているわけではないですよね。
    複雑な子要素を持つものもあれば、辞書のようになっているものもありますし、子要素をもたない XmlElement もあります。
     
    そういったものすべてに対応するには、完全な置き換えしかサポートできなかったのだと思います。
    XmlDiffgram などを用いて差分更新していくことも不可能ではないでしょうけど、構成ファイルはかなり自由度の高いものですので、外部ファイルでの指定が非常に複雑化するなど、ちょっと無理がある思います。
     
    2007年3月15日 6:15