【发布时间】:2021-07-28 09:08:51
【问题描述】:
有人能解释一下如何在动作中访问对象的属性吗? object.property 或 $object.property 或 ${object.property} 或 ${{object.property}} 不起作用。
我使用 fromJson() 方法从 JSON 文件中的数据创建了一个对象:
- name: "Get env data"
id: get_env_data
run: |
JSON=$(jq --arg inputEnv "${{ github.event.inputs.env_to_deploy }}" 'map(. | select(.deployEnv==$inputEnv) ) | .[0]' .github/workflows/test.json)
JSON="${JSON//$'\n'/''}"
JSON="${JSON//$'\r'/''}"
JSON="${JSON//$'\s+'/''}"
echo "JSON=$JSON"
echo "::set-output name=deployment_env::$JSON"
- name: "Set env data"
run: |
env_data=${{ fromJson(steps.get_env_data.outputs.deployment_env) }}
echo "env_data=$env_data"
echo $env_data.port
JSON文件是这样的:
[
{
"env":"dev",
"port":"8000",
"db_host":"DEV_DB_HOST"
},
{
"env":"dev2",
"port":"8002",
"db_host":"DEV2_DB_HOST"
},
{
"env":"dev3",
"port":"8003",
"db_host":"DEV3_DB_HOST"
}
]
【问题讨论】:
-
看起来很像this question。您是否尝试直接使用:
echo "${{fromJson(steps.get_env_data.outputs.deployment_env)}}"来查看是否正确检索了 json?似乎也可以直接使用这样的东西:echo "${{fromJson(steps.get_env_data.outputs.deployment_env).[0].port}}"(因为它是一个列表,我认为您将无法在不通知位置的情况下直接访问该端口)。 -
结果,我收到了有效的 JSON 作为对象而不是数组(| .[0] 完成了这项工作)。 echo "JSON=$JSON" 输出正确的 JSON。 echo $env_data.port - Object.port
-
如果您直接使用
echo "${{fromJson(steps.get_env_data.outputs.deployment_env).port}}"作为Set env data步骤的第一个命令。有用吗? -
是的,它显示了正确的端口号。
-
我认为不可能在 GHA 上以这种方式获取整个对象,而是每次仅从 JSON 中提取一个字段值。一种解决方法是提取不同 env 变量中的所有字段以便之后访问它们,但显然这不是最好的解决方案。
标签: json github-actions