13

私の .csproj ファイルから:

<Content Include="log4net.config">
  <SubType>Designer</SubType>
</Content>
<Content Include="log4net.Release.config">
  <DependentUpon>log4net.config</DependentUpon>
</Content>
<Content Include="log4net.Debug.config">
  <DependentUpon>log4net.config</DependentUpon>
</Content>
<Content Include="log4net.Live.config">
  <DependentUpon>log4net.config</DependentUpon>   
</Content>
<Content Include="log4net.Demo.config">
  <DependentUpon>log4net.config</DependentUpon>   
</Content>  

私の .csproj ファイルの下部に:

  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
    <Target Name="AfterCompile" Condition="exists('log4net.$(Configuration).config')">
      <TransformXml Source="log4net.config"
        Destination="$(IntermediateOutputPath)$(TargetFileName).config"
        Transform="log4net.$(Configuration).config" />
      <ItemGroup>
        <AppConfigWithTargetPath Remove="log4net.config"/>
        <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
          <TargetPath>$(TargetFileName).config</TargetPath>
        </AppConfigWithTargetPath>
      </ItemGroup>
    </Target>

log4net.config から

<connectionString name="ConnName" 
value="Data Source=localhost\sqlexpress;Initial Catalog=localdb;Persist Security Info=True;Integrated Security=SSPI;" />

log4net.Live.config から(機密データを削除)

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <connectionString name="ConnName" value="Data Source=127.0.0.1;Initial Catalog=DBName;Persist Security Info=True;User ID=userid;Password=pword"
        providerName="System.Data.SqlClient" xdt:Transform="Replace" xdt:Locator="Match(name)" />
</configuration>

msbuild の出力を確認したところ、web.config が正しく変換されたことがわかりましたが、log4net を変換する出力が表示されません。また、公開後に log4net.config ファイルを確認すると、元の接続文字列が含まれています。

私は何を間違っていますか:)?

ありがとう!

アップデート

msbuild が表示していない警告として出力していたコードに、いくつかのエラーがありました。それらを修正したところ、MSBuild からいくつかの出力が得られました。

AfterCompile: Transforming Source File: log4net.config Applying Transform File: log4net.Live.config 出力ファイル: obj\Live\Common.UI.Web.dll.config
変換成功

ファイルは Common.UI.Web.dll.config ではなく log4net.config という名前にする必要があるため、これはまだ問題です...

理由はともかく

$(ターゲットファイル名)

.csproj ファイル名の名前をとっています。log4netだけに置き換えると、正しく出力されます

アップデート

ファイルが obj フォルダーにスタックしており、公開時に取得されません。

4

6 に答える 6

15

更新:Visual Studio 2012の場合(これらの更新はVS2010でも機能します)

多くの異なるソリューションを試した後、web.Config変換がどのように行われるかを掘り下げました...これが私が最もエレガントなソリューションを見つけたものです。

まず、log4net.configファイルをプロジェクトから除外します。ただし、プロジェクトのXMLを本当に理解していない限り、非常に紛らわしい重複参照が発生する可能性があります。ファイルを削除しないでください(プロジェクトエディタを介してファイルを含めます)。

次に、プロジェクトをアンロードしてから編集します...または、プロジェクトxmlにアクセスすることを選択します。Microsoft.WebApplication.targetsをインポートするノードがあることを確認してください。Webプロジェクトに参加している場合は、追加されている可能性があります...このノードを検索してください

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

このノードを取得したら、ItemGroupノードを追加するだけで済みます...

<ItemGroup>
  <WebConfigsToTransform Include="log4net.config">
    <DestinationRelativePath>log4net.config</DestinationRelativePath>
    <Exclude>False</Exclude>
    <TransformFileFolder>$(TransformWebConfigIntermediateLocation)\original</TransformFileFolder>
    <TransformFile>log4net.$(Configuration).config</TransformFile>
    <TransformOriginalFolder>$(TransformWebConfigIntermediateLocation)\original</TransformOriginalFolder>
    <TransformOriginalFile>$(TransformWebConfigIntermediateLocation)\original\%(DestinationRelativePath)</TransformOriginalFile>
    <TransformOutputFile>$(TransformWebConfigIntermediateLocation)\transformed\%(DestinationRelativePath)</TransformOutputFile>
    <TransformScope>$(_PackageTempDir)\%(DestinationRelativePath)</TransformScope>
    <SubType>Designer</SubType>
  </WebConfigsToTransform>
  <None Include="log4net.Debug.config">
    <DependentUpon>log4net.config</DependentUpon>
  </None>
  <None Include="log4net.Release.config">
    <DependentUpon>log4net.config</DependentUpon>
  </None>
</ItemGroup>

依存ファイルをItemGroupに含めましたが、これは必須ではありませんが、物事をまとめています。新しいタスクまたはターゲットを作成しなかったことに注意してください。これで、変換はweb.config変換とまったく同じように処理されます。

于 2011-05-13T22:01:31.830 に答える
7

web.configMicrosoft の従業員が自由時間に、SlowCheetah と呼ばれる拡張機能で、すべてのファイルに対してこれを行う機能を追加しました。SlowCheetah Xml Transformのレビューとvsi 拡張機能のダウンロードを確認してください。

于 2011-08-23T16:56:04.807 に答える
2

アプリ構成とlog4net構成の両方にhttp://mint.litemedia.se/2010/01/29/transforming-an-app-config-file/を使用することになりました。非常にうまく機能します。

log4net 構成の場合、これを csproj に追加します。

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <Target Name="ApplyConfiguration" Condition="Exists('log4net.$(Configuration).config')">  
       <XslTransformation XmlInputPaths="log4net.config" XslInputPath="log4net.$(Configuration).config" OutputPaths="log4net.config_output" />  
       <Copy SourceFiles="log4net.config_output" DestinationFiles="log4net.config" />  
   </Target>  
   <Target Name="BeforeBuild">  
       <CallTarget Targets="ApplyConfiguration"/>  
   </Target> 
于 2011-04-11T15:30:42.100 に答える
2

For me this solution worked best (VS2013):

  <Target Name="ApplyLoggingConfiguration" BeforeTargets="BeforeBuild" Condition="Exists('log4net.$(Configuration).config')">
    <TransformXml Source="log4net.config" Transform="log4net.$(Configuration).config" Destination="log4net.config" />
  </Target>

If you have other properties than $(Configuration) you are free to use what you need. We use publishprofiles and use this msbuild command in our CI build

msbuild ConfigTransform.sln /p:DeployOnBuild=true;PublishProfile=Test;Configuration=Release

in this case just replace $(Configuration) with $(PublishProfile)

于 2014-05-08T18:19:43.073 に答える
2

次の記事を使用して、このタイプの構成を行いました

http://geekswithblogs.net/EltonStoneman/archive/2010/08/20/using-msbuild-4.0-web.config-transformation-to-generate-any-config-file.aspx

それは私にとって最も役に立ちました

于 2011-04-05T20:22:17.230 に答える