【问题标题】:SlowCheetah - Using transformed linked config files to share configuration elementsSlowCheetah - 使用转换后的链接配置文件来共享配置元素
【发布时间】:2012-04-30 23:58:34
【问题描述】:

我要做什么

目前,我们的解决方案中的多个项目中有重复的 WCF 配置设置。我想将 WCF 配置值存储在一个文件中,然后可以根据需要从尽可能多的项目中引用该文件。配置文件必须可转换以允许在不同环境中使用不同的值。

我的尝试

我做了一些研究,其他人已经尝试过使用 SlowCheetah 和链接文件的类似方法。所以这就是我试图做的。值得注意的是,我们的解决方案包含很多项目,一些 MVC3、一些控制台应用和一些类库。

  1. 我创建了一个 Wcf.Client.config 文件,将其添加到一个通用类库中,并使用 SlowCheetah 添加了转换
  2. 我想在 MVC3 项目中引用此文件,因此我创建了指向配置文件的链接
  3. 在 MVC3 项目的 web.config 文件中,我添加了一个组,该组包含一个客户端元素,其 configSource 属性设置为“Wcf.Client.config”
  4. 我已将链接配置文件的“复制到输出目录”属性设置为“如果较新则复制”
  5. 我还向链接文件添加了转换(我不确定这是否可行,但它成功链接了文件)

问题

我对本地和开发环境进行了转换。不幸的是,当我在开发人员配置中运行 Web 应用程序(或发布它)时,没有拾取转换。查看发布的文件我可以看到我放在web项目根目录中的链接文件已经成功转换,但是,它是从bin文件夹中读取的,bin文件夹中的文件是not 转换。

我到底在问什么?

我真正想知道的是,我做错了什么?有没有人尝试过我上面描述的并使它起作用?或者失败了,有没有人找到另一种方法来共享转换后的配置文件?

一些代码

我创建了一个非常简单的test project,希望它能比我漫无边际的解释更好地解释我想要做的事情。随意看看。如果您构建或发布它,您将看到 MVC3 项目的 bin 文件夹中的 Wcf.Client.config 文件尚未转换。

【问题讨论】:

  • 菲尔,你有什么运气吗?我们正在寻求做类似的事情......
  • 恐怕不行。我没有设法让 SlowCheetah 按我的意愿工作,我也没有设法找到另一个解决方案。不幸的是,我在这个问题上浪费了相当多的时间,所以我只需要处理重复的配置,这很垃圾,但它们很少会改变,所以不会造成任何问题。
  • 你能试试我刚刚发布到visualstudiogallery.msdn.microsoft.com/…的最新版本2.5.1吗?让我知道它是否不起作用。大约一两个月前,我为链接文件做了很多工作。
  • 我已经用 2.4.1 重新测试了它(我找不到 2.5.1 不确定它是否是一个错字),不幸的是我没有运气。还是不行。
  • 我得到了这个工作。如果您查看 v 2.5.1 或更高版本中的 SlowCheetah.Samples/Wpf.Transform/Wpf.Transform.csproj,您可以看到链接的配置文件在 csproj 中的外观。我必须将 元素添加到我的(在链接到另一个项目中的配置的项目上)。

标签: asp.net-mvc-3 web-config slowcheetah


【解决方案1】:

我在answer 中找到了合适的解决方案。

我已经完成了以下步骤:

1) 我在解决方案目录中创建了配置。我的名字是CommonSettings.config

2) 我添加了转换配置CommonSettings.Debug.configCommonSettings.Debug.config 和源配置(因为微软的构建任务由于某种原因无法写入源文件)CommonSettings.Source.config

3)。然后在一个通用类库(所有需要CommonSettings.config 的项目都引用该类库)中,我通过添加以下几行来编辑项目文件:

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" />

<Target Name="BeforeBuild">
    <CallTarget Targets="TransformCommonSettings" />
</Target>

<Target Name="TransformCommonSettings">
    <ItemGroup>
        <ConfigsToTransform Include="..\CommonSettings.config" />
    </ItemGroup>

    <TransformXml 
        Source="@(ConfigsToTransform->'%(RelativeDir)%(Filename).Source%(Extension)')"
        Destination="%(FullPath)"
        Transform="%(RelativeDir)%(Filename).$(Configuration)%(Extension)"
        Condition="Exists('%(RelativeDir)%(Filename).$(Configuration)%(Extension)')" /> 
</Target>

4) 然后我将CommonSettings.config 作为链接添加到我的 Web 应用程序(以及一些 Windows 应用程序和测试)中。在属性窗口中,我将 Build Action 设置为 Content 并将 Copy to Output Directory 设置为 Copy always 5) 在我的Web.config 文件中注册commonSettings 部分后,我添加了以下行:

<commonSettings configSource="bin\CommonSettings.config" />

6) 对于测试项目和控制台/Windows 应用程序,我在 App.config 中设置了适当的值:

<commonSettings configSource="CommonSettings.config" />

这里路径中没有bin,因为App.configCommonSettings.config 都被复制到了输出目录。

现在在构建我选择的配置后,CommonSettings.config 被正确转换,并且正确的版本被复制到输出目录。

好处是你不需要 SlowCheetah 扩展,它可以在你的构建服务器上运行,如果你包含任务 .dll 对我来说是完美的:)

一个问题是当您只运行一个项目(按 F5)时,转换将不会运行。我不得不将这个构建任务添加到我的所有项目中,这使构建过程减慢了大约一秒钟,但对我来说这是可以接受的。

【讨论】:

    猜你喜欢
    • 2012-04-10
    • 2017-12-25
    • 2018-09-14
    • 2021-12-21
    • 2012-05-05
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多