web-dev-qa-db-ja.com

Visual Studio WebサイトプロジェクトでWeb.config変換を行うにはどうすればよいですか?

Visual Studio 2010 Webサイトプロジェクトのビルド構成を変更する (Visual Studio Webアプリケーションではなく)は不可能のようです。ビルド構成を変更することは、Web.configを有効にするための重要な部分です。変換(構成をデバッグ以外のものに変更することはできません)。

ビルド構成を変更できない場合、Web.config変換をVisual Studio 2010 Webサイトプロジェクトで機能させるにはどうすればよいですか?

27
Ryan Shripat

私はここでこれに対する解決策を説明するかなり良いブログ投稿を見つけました: http://andrewtwest.com/2010/02/25/using-web-config-transformations-in-web-site-projects/ ==

つまり、Webサイトを含むソリューションに空のプロジェクトを作成します(別のWebサイトプロジェクトでない限り)。空のプロジェクトでは、プロジェクトファイルを介してmsbuildにアクセスできます。これにより、Webサイトweb.configで変換を実行できます。

6
porusan

Webアプリケーションプロジェクトソリューション全体をそのまま使用したくありません。私の解決策は、Microsoft.Web.Publishing.Tasks.dllで定義されているXmlTransformタスクを直接使用することです(このタスクはWebConfigTransformationのコアです)。このようにして、十分な柔軟性があり、期待どおりの動作を実行します。たとえば、web.configの変換に使用しているWebSiteTransformator.csprojを次に示します。

これは、元のWebConfigTransformationでは到達できない柔軟性の例でもあります。web.Template.configを取得し、それにweb。$(Configuration).configを適用して、web.configを書き込みます。これにより、web.config自体をソース管理の無視リストに追加できます。ウェブサイトで参照されるのはまだ有効なcsprojです:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <SchemaVersion>2.0</SchemaVersion>
    <OutputType>Library</OutputType>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    <OutputPath>$(TEMP)\TransformWebConfig\bin</OutputPath>
    <BaseIntermediateOutputPath>$(TEMP)\TransformWebConfig\obj\</BaseIntermediateOutputPath>
    <IntermediateOutputPath>$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
    <WebFolderName>$(SolutionDir)\MyWebSite\</WebFolderName>
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="Dummy.cs" />
  </ItemGroup>
  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Target Name="BeforeBuild">
    <TransformXml Source="$(WebFolderName)Web.Template.config"
                  Transform="$(WebFolderName)Web.$(Configuration).config"
                  Destination="$(WebFolderName)Web.config" />
  </Target>
</Project>
9
Andriy K

私は少し別のアプローチを使用しました。まだ少しハックですが、もっと簡単だと思います。これは私にとってはうまくいきましたが、明らかに利用可能なさまざまな構成がたくさんあるので、すべての人にとってうまくいくとは保証できません。これは、Webサイトが公開される前に最初にAppDataフォルダーにパッケージ化される方法を中心に展開されます...

  1. Web.Release.configファイルをWebサイトに手動で追加し、必要な変換を追加します。明らかに、Webサイトには「構成変換の追加」オプションがないため、これを手動で行う必要があります。 Web.Release.configの例:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration xmlns:xdt="http://schemas.Microsoft.com/XML-Document-Transform">
        <appSettings>
            <add key="MySetting" value="NewValue" xdt:Transform="Replace" xdt:Locator="Match(key)" />
        </appSettings>
        <system.web>
            <compilation xdt:Transform="RemoveAttributes(debug)" />
        </system.web>
    </configuration>
    
  2. website.publishprojファイル内で、構成がリリースに設定されていることを確認します。

    <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
    
  3. website.publishprojの一番下(</Project>の直前)に以下を追加します。

    <Target Name="AfterBuild">
      <MakeDir Directories="$(PackageArchiveRootDir)\..\CSAutoParameterize\original" />
      <TransformXml Source="Web.config" Transform="Web.$(ConfigurationName).config" Destination="$(PackageArchiveRootDir)\..\CSAutoParameterize\original\Web.config" StackTrace="false" />
    </Target>
    
4
Moo

上記のAndriyのコメントで述べたように、 ソリューション全体のビルドイベント は間違いなくこれを行うためのよりクリーンな方法のようです。

コメントで少し迷ってしまうので、別の答えとして追加しますが、IMHOがベストアンサーです。 AndriyKとSayedIbrahimへの小道具。

2
James

Web.Template.configを必要としない場合は、次を使用しました。

<PropertyGroup>
    <_tempSourceFile>$([System.IO.Path]::GetTempFileName())</_tempSourceFile>
    <_tempTransformFile>$([System.IO.Path]::GetTempFileName())</_tempTransformFile>
</PropertyGroup>

<Copy SourceFiles="$(ProjectDir)Web.config" DestinationFiles="$(_tempSourceFile)"/>
<Copy SourceFiles="$(ProjectDir)Web.$(Configuration).config" DestinationFiles="$(_tempTransformFile)"/>

<TransformXml Source="$(_tempSourceFile)"
              Transform="$(_tempTransformFile)"
              Destination="$(ProjectDir)Web.config"
              StackTrace="false" />

答えから適応 ここ

1
Simeon Bartley

VS 2017で公開プロファイルを作成し、App_Data\PublishProfilesで.pubxmlプロファイルを右クリックして、[構成変換の追加]を選択します。

https://social.msdn.Microsoft.com/Forums/vstudio/en-US/31f41991-abb2-41de-ad0b-c1379cc7c806/vs-2013-express-for-web-webconfig-transforms?forumを参照してください= visualstudiogeneral&prof = required

0
daniel