首页 文章

SlowCheetah - 使用转换的链接配置文件来共享配置元素

提问于
浏览
3

What I'm trying to do

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

What I've tried

我做了一些研究,其他人尝试过与SlowCheetah和链接文件相似的东西 . 所以这就是我试过的 . 值得注意的是,我们的解决方案包含许多项目,一些MVC3,一些控制台应用程序和一些类库 .

  • 我创建了一个Wcf.Client.config文件,将其添加到公共类库并使用SlowCheetah向其添加了变换

  • 我想在MVC3项目中引用这个文件,所以我创建了一个配置文件的链接

  • 在MVC3项目的web.config文件中,我添加了一个包含客户端元素的组,其configSource属性设置为"Wcf.Client.config"

  • 我已将链接配置文件的"Copy to output directory"属性设置为"Copy if newer"

  • 我还在链接文件中添加了一个转换(我不确定这会起作用,但它会成功链接文件)

The problem

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

What am I actually asking?

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

Some code

我已经创建了一个非常简单的test project,希望能够解释我在MVC3项目的bin文件夹中看到Wcf.Client.config文件尚未转换的内容 .

1 回答

  • 2

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

    我已经完成了以下步骤:

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

    2)我添加了转换配置 CommonSettings.Debug.config ,_ CommonSettings.Debug.config 和源配置(因为Microsoft 's build task could' t由于某种原因写入源文件) 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应用程序和测试)作为链接 . 在属性窗口中,我将构建操作设置为内容并复制到输出目录以便始终复制5)在注册 commonSettings 部分后,在我的 Web.config 文件中添加了以下行:

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

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

    <commonSettings configSource="CommonSettings.config" />
    

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

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

    好的部分是你不需要没有SlowCheetah扩展,它可以在你的构建服务器上工作,如果你包含任务.dll :)这对我来说是完美的 .

    一个问题是当你刚刚运行一个项目(点击F5)时,转换将不会运行 . 我不得不将这个构建任务添加到我的所有项目中,这会使建筑过程减慢一秒钟,但对我来说这是可以接受的 .

相关问题