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:转换源文件:log4net.config 应用转换文件:log4net.Live.config 输出文件:obj\Live\Common.UI.Web.dll.config
转换成功

这仍然是一个问题,因为文件应该命名为log4net.config,而不是Common.UI.Web.dll.config...

无论出于何种原因

$(目标文件名)

采用 .csproj 文件名的名称。如果我只用 log4net 替换它,那么它会正确输出

更新

文件卡在 obj 文件夹中,发布时没有被拾取。

4

6 回答 6

15

更新:对于 Visual Studio 2012(这些更新也适用于 VS2010)

在尝试了许多不同的解决方案后,我深入研究了 web.Config 转换是如何发生的……这是我发现的最优雅的解决方案。

首先从您的项目中排除您的 log4net.config 文件,除非您真正了解项目 XML,否则您最终可能会得到一个非常混乱的重复引用。不要删除文件只是排除它们(我们将通过项目编辑器包括它们)。

现在卸载您的项目,然后对其进行编辑......或者您选择进入 proj 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.config,在名为 SlowCheetah 的扩展程序中。查看评论SlowCheetah Xml Transformvsi 扩展下载

于 2011-08-23T16:56:04.807 回答
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 回答
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

对我来说,这个解决方案效果最好(VS2013):

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

如果你有 $(Configuration) 以外的其他属性,你可以自由使用你需要的东西。我们使用 publishprofiles 并在我们的 CI 构建中使用这个 msbuild 命令

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

在这种情况下,只需将 $(Configuration) 替换为 $(PublishProfile)

于 2014-05-08T18:19:43.073 回答
0

ms007 的回答几乎让我到了那里,尽管我在文件上遇到了拒绝访问的问题,因为构建服务器已将其设置为只读。这是我的解决方案。

  <Target Name="ApplyLoggingConfiguration" BeforeTargets="BeforeBuild" Condition="Exists('log4net.$(Configuration).config')">

    <TransformXml Source="log4net.config"
                  Transform="log4net.$(Configuration).config"
                  Destination="temp_log4net.config" />
    <Copy SourceFiles="temp_log4net.config"
          DestinationFiles="log4net.config"
          OverwriteReadOnlyFiles="True" />

    <Delete Files="temp_log4net.config" />
  </Target>
于 2017-06-05T12:00:03.700 回答