Web.debug.config
Visual Studio 2010の組み込みデバッガーでマージして使用するにはどうすればよいですか?
回答:
これは既知のバグです。この機能は、現在、デプロイプロセスの一部としてのみ使用できます。
これにも遭遇した場合は、賛成してください。これはできるだけ早く修正されます。
これは実際には非常に簡単に実行でき、信じられないかもしれませんが、これがVSが機能するように設計されている方法のようです。
web.configを含むプロジェクトの.csprojファイルの終了「Project」タグの直前に次の行を逐語的に追加します。
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="Transform">
<MakeDir Directories="obj\$(Configuration)" Condition="!Exists('obj\$(Configuration)')" />
<TransformXml Source="Web.Config" Transform="Web.$(Configuration).config" Destination="obj\$(Configuration)\Web.config" StackTrace="true" />
</Target>
web.configファイルを含むプロジェクトのプロジェクトプロパティのビルド後のイベントに、次の行をそのまま入力します。変換を実行するビルド構成ごとにこれを実行します。
"$(MSBUILDBINPATH)\msbuild" "$(ProjectPath)" /t:Transform /p:Configuration=$(ConfigurationName);Platform=AnyCPU
xcopy "$(ProjectDir)obj\$(ConfigurationName)\Web.Config" "$(ProjectDir)". /F /R /Y
Web.config
ため、すべての変換は「べき等」である必要があることに注意してください(他の変換の結果に再適用できます)。また、ファイルをソース管理に置いた場合(おそらくそうすべきですが)、正気を保つことができなくなります。全体として、複雑さ/痛みを次の一連の問題に移す「単純な」ハック。そこで「より良く」取り組むことができれば良いが、そうでなければ悪い。また、VSバージョンをハードコーディングする代わりに$(VisualStudioVersion)を使用することを検討してください(変更するのを忘れます)。
タグの直前の.csprojファイルの最後にこれを追加することで、これをより簡単な方法で解決しました。これはkeitnの回答に似ていますが、ビルド後のイベントを使用しない点が異なります。
<Target Name="BeforeBuild">
<TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
</Target>
プロジェクトのweb.configを更新したくなかったので、最終的にbinフォルダーに格納されたものだけを更新したので、次のようにしました。
.csprojの最後(最後の終了プロジェクトタグの直前)に以下を追加します
<Target Name="Transform">
<MakeDir Directories="bin" Condition="!Exists('bin')" />
<TransformXml Source="Web.Config" Transform="Web.$(Configuration).config" Destination="bin\$(TargetFileName).config" StackTrace="true" />
</Target>
次に、次のビルド後の手順を追加します
"$(MSBUILDBINPATH)\msbuild" "$(ProjectPath)" /t:Transform /p:Configuration=$(ConfigurationName);Platform=AnyCPU
これは、ビルド時に、デバッグ/リリース構成から出力binディレクトリのWebsiteName.Configファイルへの変換が行われるため、プロジェクトのメインweb.configに干渉しないことを意味します。
多くの同様の投稿を読み、ファイルを上書きできない、または読み取り専用であるためにweb.configにアクセスできないという問題が発生した後、これが私のために働いたものです。
<Target Name="BeforeBuild" Condition="$(Configuration) == 'MyAltDebugConfiguration'">
<ItemGroup>
<OriginalWebConfig Include="$(ProjectDir)Web.config"/>
<TempWebConfig Include="$(ProjectDir)TempWeb.config"/>
</ItemGroup>
<Exec Command=""$(DevEnvDir)tf.exe" checkout "$(ProjectDir)Web.config"" />
<Copy SourceFiles="@(OriginalWebConfig)" DestinationFiles="@(TempWebConfig)" />
<TransformXml Source="$(ProjectDir)TempWeb.config"
Transform="Web.$(Configuration).config"
Destination="Web.config" />
</Target>
ノート:
これはBeforeBuildターゲットとして実行されます。
特定の構成(代替デバッグ環境)でのみ実行したいので、条件があります。Webデプロイを介してデプロイする場合、公開ターゲットが起動し、このターゲットを実行する必要はありません。
web.configをチェックアウトすることを覚えておく必要はないので(完了したら元に戻すだけです)、変換を開始する前にweb.configをチェックアウトします。TFSを使用していない場合は、この行を削除できます。
VS(2010)\ msbuildはソースweb.configを手放したくないので、一時ファイルを使用します(情報については、この記事に感謝します:http://www.diaryofaninja.com/blog/2011/09/ 14 / using-custom-webconfig-transformations-in-msbuild)
TempWeb.configを削除するコマンドを追加しようとしましたが、VS \ msbuildはそれを手放したくありません。TFSに追加されないので、私はそれと一緒に暮らすことができます。
The command ""C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\tf.exe" checkout "C:\_Code\RTS\SCTimeSheet\Web.config"" exited with code 9009
。何か案は?
私はこれが古いことを知っていますが、私は同じ問題に直面しています。デフォルトのWeb.configからエンドポイント、接続文字列などを置き換えるテスト、ステージング、ライブ構成があります
しかし、私は次のことをします:
それはそれほど多くのステップではなく、あなたがそれのコツをつかむとかなり速く行われます。お役に立てれば。:)
@ologesa:ソリューションには元のWeb.configへの書き込みアクセスが必要です(TFSでチェックアウトする必要があります)。より良い解決策は、keitnがこれを行うように、binフォルダーにWeb.configを直接生成することです。keitnとあなたのソリューションを組み合わせると、次のようになります。
<Target Name="BeforeBuild">
<Message Text="Transforming Web.config from Web.$(Configuration).config" Importance="high" />
<MakeDir Directories="bin" Condition="!Exists('bin')" />
<TransformXml Source="Web.Config" Transform="Web.$(Configuration).config" Destination="bin\$(TargetFileName).config" StackTrace="true" />
</Target>