【问题标题】:How to replace variables of JSON file in Team Services?如何在 Team Services 中替换 JSON 文件的变量?
【发布时间】:2021-03-12 02:16:57
【问题描述】:

我被 Angular 项目的发布变量替换卡住了。我有一个settings.json 文件,我想替换一些变量:

{ 
    test : "variable to replace"
}

我试图在市场上找到一些自定义任务,但所有任务似乎只适用于 web.config 的 xml 文件。

【问题讨论】:

    标签: azure-devops


    【解决方案1】:

    我使用来自市场的“替换令牌”https://marketplace.visualstudio.com/items?itemName=qetza.replacetokens

    您将所需的值定义为发布定义中的变量,然后添加替换标记任务并为存储库中要替换值的所有目标文本文件配置通配符路径(例如:**/*. json)。被替换的令牌具有可配置的前缀和后缀(默认为 '#{' 和 '}#')。因此,如果您有一个名为 constr 的变量,则可以将其放入 config.json

    {
       "connectionstring": "#{constr}#"
    }
    

    它会像这样部署文件

    {
       "connectionstring": "server=localhost,user id=admin,password=secret"
    }
    

    【讨论】:

    • 哪里提供json文件列表?
    【解决方案2】:

    VSTS 版本中的 IIS Web 应用部署任务在 *File Transforms & Variable Substitution Options 下具有 JSON 变量替换。 提供需要替换的变量的 json 文件列表和 JSONPath 表达式

    例如,要替换下面示例中的“ConnectionString”的值,您需要在构建/发布定义(或发布定义的环境)中定义一个变量为“Data.DefaultConnection.ConnectionString”。

    {
      "Data": {
        "DefaultConnection": {
          "ConnectionString": "Server=(localdb)\SQLEXPRESS;Database=MyDB;Trusted_Connection=True"
        }
      }
    }
    

    【讨论】:

    • 但是还有一个问题:我也可以替换受保护的变量吗?因为它们没有作为环境变量传递给发布任务?
    • 哪里提供json文件列表?
    • @flaZer IIS Web App 部署任务有一个可扩展部分 - 文件转换和变量替换选项。在 JSON 文件的行分隔列表中有 JSON 变量替换 textarea
    【解决方案3】:

    您可以在发布变量选项卡中添加一个变量,然后使用 PowerShell 任务更新您的 settings.json 的内容。

    假设原始内容是

    { 
        test : "old
    }
    

    你想把它改成

    { 
        test : "new"
    }
    

    所以你可以用以下步骤替换 json 文件中的变量:

    1。添加变量

    在发布变量选项卡中使用您要替换的值定义一个变量(变量test,值为new):

    2。添加 PowerShell 任务

    powershell 任务设置:

    类型:内联脚本。

    内联脚本:

    # System.DefaultWorkingDirectory is the path like C:\_work\r1\a, so you need specify where your appsettings.json is.
    $path="$(System.DefaultWorkingDirectory)\buildName\drop\WebApplication1\src\WebApplication1\appsettings.json"
    (Get-Content $path) -replace "old",$(test) | out-file $path
    

    【讨论】:

    • 这不需要您知道之前的值,而不是属性名称吗?这是非常脆弱的。
    • 如果“测试”值因环境而异怎么办?例如开发“test”的值为“devNew”,阶段“test”的值为“stageNew”,Prod的“test”值为“prodNew”。在这种情况下,您的解决方案将如何工作?您是否需要为每个环境添加三个任务并在部署期间继续禁用其他两个?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 2016-05-12
    • 2020-11-27
    • 1970-01-01
    相关资源
    最近更新 更多