Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在生成的GUID值上链接json对象_Javascript_Python_Json_Npm_Awk - Fatal编程技术网

Javascript 在生成的GUID值上链接json对象

Javascript 在生成的GUID值上链接json对象,javascript,python,json,npm,awk,Javascript,Python,Json,Npm,Awk,我正在寻找一种方法来自动化在随机guid上链接多个JSON对象这一单调乏味的工作 有几个相互关联的JSON格式文件: { "name": "some.interesting.name", "description": "helpful description", "instanceId": "random-GUID.for.some.interesting.nam

我正在寻找一种方法来自动化在随机guid上链接多个JSON对象这一单调乏味的工作

有几个相互关联的JSON格式文件:

{
    "name": "some.interesting.name",
    "description": "helpful description",
    "instanceId": "random-GUID.for.some.interesting.name",
    "policies": [
        {
        "name": "some.interesting.name-policy",
        "instanceId": "random-GUID.for.some.interesting.name-policy"
        }
    ],
    "attributes": [
       "one": {
         "ref": "!some.interesting.name-2#random-GUID.for.some.interesting.name-2"
       }
    ]
}
这些名称是静态的和可读的。 文件位置是静态的,并遵循名称结构

每当开发人员对任何文件进行最微小的更改时,InstanceId都需要更改。 正在寻找一个工具,或者关于如何编写一个工具的想法,以便在集合中的每个文件的正确位置随机生成和插入guid

注意:我们正在成功地使用生成GUID,因此解决了随机值的问题

提供一个最小的可测试示例。 输入将是配置目录及其下的所有文件

策略文件: 配置/policy/my_policy.js

{
   "name" : "policy.my_policy"
   "instanceId": "{$policy.my_policy}"
 
   "assets": [
       {  
         "user-info": "!assets.current_user_info#{$assets.current_user_info}"
       },
   ]

   "commands": [
      {
         "update-user": "!commands.update_admin_user#{$commands.update_admin_user}"
       }
   ]
}
{
   "name" : "policy.my_policy"
   "instanceId": "b35970fe-96dd-481d-a244-8880cc0cb818"
 
   "assets": [
       {  
         "user-info": "!assets.current_user_info#c3a17d65-921d-4cc4-9e23-5d40bd519289}"
       },
   ]

   "commands": [
      {
         "update-user": "!commands.update_admin_user#52a9a82e-a4e4-42f1-8376-a4e5ac06c9bd"
       }
   ]
}
配置/资产/当前用户\u info.js

{
   "name" : "assets.current_user_info"
   "instanceId": "{$assets.current_user_info}"
   "attribute": {
       "type": "string",
       "value": "admin"
   }
}
{
   "name" : "assets.current_user_info"
   "instanceId": "c3a17d65-921d-4cc4-9e23-5d40bd519289"
   "attribute": {
       "type": "string",
       "value": "admin"
   }
}
配置/命令/更新\u admin\u user.js

{
   "name" : "commands.update_admin_user"
   "instanceId": "{$commands.update_admin_user}"
   
   "inputType": {
      "name": "assets.current_user_info"
      "instanceId": "{$assets.current_user_info}"
   }
 }
   
{
   "name" : "commands.update_admin_user"
   "instanceId": "52a9a82e-a4e4-42f1-8376-a4e5ac06c9bd"
   
   "inputType": {
      "name": "assets.current_user_info"
      "instanceId": "c3a17d65-921d-4cc4-9e23-5d40bd519289"
   }
 }
   
输出将是相同的文件,可能复制到同一文件夹结构中的输出目录, 变量在哪里

$assets.current_user_info
$commands.update_admin_user
$policy.my_policy 
在使用npm nanoid或类似库生成的所有文件中,都用GUID值替换

策略文件: 配置/policy/my_policy.js

{
   "name" : "policy.my_policy"
   "instanceId": "{$policy.my_policy}"
 
   "assets": [
       {  
         "user-info": "!assets.current_user_info#{$assets.current_user_info}"
       },
   ]

   "commands": [
      {
         "update-user": "!commands.update_admin_user#{$commands.update_admin_user}"
       }
   ]
}
{
   "name" : "policy.my_policy"
   "instanceId": "b35970fe-96dd-481d-a244-8880cc0cb818"
 
   "assets": [
       {  
         "user-info": "!assets.current_user_info#c3a17d65-921d-4cc4-9e23-5d40bd519289}"
       },
   ]

   "commands": [
      {
         "update-user": "!commands.update_admin_user#52a9a82e-a4e4-42f1-8376-a4e5ac06c9bd"
       }
   ]
}
配置/资产/当前用户\u info.js

{
   "name" : "assets.current_user_info"
   "instanceId": "{$assets.current_user_info}"
   "attribute": {
       "type": "string",
       "value": "admin"
   }
}
{
   "name" : "assets.current_user_info"
   "instanceId": "c3a17d65-921d-4cc4-9e23-5d40bd519289"
   "attribute": {
       "type": "string",
       "value": "admin"
   }
}
配置/命令/更新\u admin\u user.js

{
   "name" : "commands.update_admin_user"
   "instanceId": "{$commands.update_admin_user}"
   
   "inputType": {
      "name": "assets.current_user_info"
      "instanceId": "{$assets.current_user_info}"
   }
 }
   
{
   "name" : "commands.update_admin_user"
   "instanceId": "52a9a82e-a4e4-42f1-8376-a4e5ac06c9bd"
   
   "inputType": {
      "name": "assets.current_user_info"
      "instanceId": "c3a17d65-921d-4cc4-9e23-5d40bd519289"
   }
 }
   
输入:

$ cat vars2guids
$assets.current_user_info       c3a17d65-921d-4cc4-9e23-5d40bd519289
$commands.update_admin_user     52a9a82e-a4e4-42f1-8376-a4e5ac06c9bd
$policy.my_policy               b35970fe-96dd-481d-a244-8880cc0cb818

$ find configuration -type f -name '*.js'
configuration/assets/current_user_info.js
configuration/commands/update_admin_user.js
configuration/policy/my_policy.js

$ head -n 50 $(find configuration -type f -name '*.js')
==> configuration/assets/current_user_info.js <==
{
   "name" : "assets.current_user_info"
   "instanceId": "{$assets.current_user_info}"
   "attribute": {
       "type": "string",
       "value": "admin"
   }
}

==> configuration/commands/update_admin_user.js <==
{
   "name" : "commands.update_admin_user"
   "instanceId": "{$commands.update_admin_user}"

   "inputType": {
      "name": "assets.current_user_info"
      "instanceId": "{$assets.current_user_info}"
   }
}

==> configuration/policy/my_policy.js <==
{
   "name" : "policy.my_policy"
   "instanceId": "{$policy.my_policy}"

   "assets": [
       {
         "user-info": "!assets.current_user_info#{$assets.current_user_info}"
       },
   ]

   "commands": [
      {
         "update-user": "!commands.update_admin_user#{$commands.update_admin_user}"
       }
   ]
}
完成初始测试后,从
#>“$tmp”和&mv--“$tmp”“$file”
中删除
#
,使原始文件由工具更新,而不是仅打印到标准输出

要创建
vars2guids
文件,请为.js文件中找到的每个变量生成一个guid,并假设变量在
{…}
中始终看起来像
$word chars.word chars
,其他任何变量都不是这样的:

vars=( $(find configuration -type f -name '*.js' -exec awk '
    {
        while ( match($0,/\{\$[[:alnum:]_]+\.[[:alnum:]_]+}/) ) {
            print substr($0,RSTART+1,RLENGTH-2)
            $0 = substr($0,RSTART+RLENGTH)
        }
    }
' {} + | sort -u) )

for var in "${vars[@]}"; do
    guid=$(echo "$RANDOM")
    printf '%s\t%s\n' "$var" "$guid"
done # > vars2guids
以上将输出:

$assets.current_user_info       29283
$commands.update_admin_user     28057
$policy.my_policy       1187
将echo“$RANDOM”更改为运行以生成GUID的任何命令。取消对
#>vars2guids
的注释,使其将输出写入
vars2guids
,而不是stdout

因此,在所有测试之后,您的脚本可能如下所示:

$ cat tst.sh
#!/usr/bin/env bash

tmp=$(mktemp) || exit 1

vars=( $(find configuration -type f -name '*.js' -exec awk '
    {
        while ( match($0,/\{\$[[:alnum:]_]+\.[[:alnum:]_]+}/) ) {
            print substr($0,RSTART+1,RLENGTH-2)
            $0 = substr($0,RSTART+RLENGTH)
        }
    }
' {} + | sort -u) )

for var in "${vars[@]}"; do
    guid=$(echo "$RANDOM")
    printf '%s\t%s\n' "$var" "$guid"
done > vars2guids

while IFS= read -r file; do

    printf '\n###########\nUpdating %s\n' "$file" >&2

    awk '
        NR==FNR { v2g[$1]=$2; next }
        {
            for (var in v2g) {
                if ( s=index($0,var) ) {
                    guid = v2g[var]
                    $0 = substr($0,1,s-1) guid substr($0,s+length(var))
                }
            }
            print
        }
    ' vars2guids "$file" > "$tmp" && mv -- "$tmp" "$file"

done < <(find configuration -type f -name '*.js')
$cat tst.sh
#!/usr/bin/env bash
tmp=$(mktemp)| |退出1
vars=($(查找配置-类型f-名称'*.js'-exec awk'
{
while(匹配($0,/\{\$[:alnum:][uh]+\.[:alnum:][uh]+}/){
打印子文件($0,RSTART+1,RLENGTH-2)
$0=substr($0,RSTART+RLENGTH)
}
}
“{}+|sort-u))
对于“${vars[@]}”中的变量;做
guid=$(回显“$RANDOM”)
printf“%s\t%s\n”$var“$guid”
完成>vars2guids
而IFS=read-r文件;做
打印“\n”更新%s\n“$file”>&2
awk'
NR==FNR{v2g[$1]=$2;next}
{
用于(v2g中的var){
如果(s=指数($0,var)){
guid=v2g[var]
$0=substr($0,1,s-1)guid substr($0,s+length(var))
}
}
打印
}
'vars2guids“$file”>“$tmp”和&mv--“$tmp”$file”

done<这里是一个Python脚本,它使用uuid.uuid4()为InstanceId生成GUI并填充所有文件中的值。文件从src/复制到output/,具有相同的目录结构。 使用python3

# Import the os module, for the os.walk function
import os
import re
import uuid

# Set the directory you want to start from
rootDir = 'src'
outputDir = 'output'

pattern = re.compile("{\$((\w*\.)*(\w)*)}")
instanceId = set([])

def findInstanceIdName(fileName):
    # print("Looking for instanceIds in " + fileName);
    found = [];
    for i, line in enumerate(open(fileName)):
        for match in re.finditer(pattern, line):
            found_match = match.group();
            found.append(found_match);
    return found;

def generateInstanceIdValue(nameList):
    values = {}
    for instanceName in nameList:
        values[instanceName] = str(uuid.uuid4());
    return values;

def processFile(inputFileName, outputFileName, instanceIdValues):
    with open(inputFileName, "r") as inputFile, open(outputFileName, "w") as outputFile:
        line = inputFile.read();
        # print("Found line: <" + line + ">");
        for key in instanceIdValues.keys():
            line = line.replace(key, instanceIdValues[key]);
        outputFile.write(line);


for dirName, subdirList, fileList in os.walk(rootDir):
    # print('Found directory: %s' % dirName)
    for fname in fileList:
        fullFileName = dirName + "/" + fname;
        instanceId.update(findInstanceIdName(fullFileName));

instanceIdValues = generateInstanceIdValue(instanceId);
#print(instanceIdValues);

for dirName, subdirList, fileList in os.walk(rootDir):
    for fname in fileList:
        outputDirName = outputDir + dirName[len(rootDir):];
        os.makedirs(outputDirName, exist_ok=True);
        fullFileName = dirName + "/" + fname;
        outputFileName = outputDir + fullFileName[len(rootDir):];
        processFile(fullFileName, outputFileName, instanceIdValues);
#为os.walk函数导入操作系统模块
导入操作系统
进口稀土
导入uuid
#设置要从中开始的目录
rootDir='src'
outputDir='output'
pattern=re.compile(“{\$(\w*\)*(\w)*)}”)
instanceId=set([])
def FindInstancedName(文件名):
#打印(“在“+文件名”中查找实例ID);
发现=[];
对于i,枚举(打开(文件名))中的行:
对于re.FindItem中的匹配(模式、行):
找到_match=match.group();
找到。追加(找到匹配项);
发现退货;
def generateInstanceIdValue(名称列表):
值={}
对于名称列表中的instanceName:
值[instanceName]=str(uuid.uuid4());
返回值;
def processFile(inputFileName、outputFileName、InstanceIdValue):
使用open(inputFileName,“r”)作为inputFile,open(outputFileName,“w”)作为outputFile:
line=inputFile.read();
#打印(“找到行:”);
对于instanceIdValues.keys()中的键:
line=line.replace(key,instanceidvalue[key]);
outputFile.write(行);
对于os.walk(rootDir)中的dirName、subdirList和fileList:
#打印('找到的目录:%s'%dirName)
对于文件列表中的fname:
fullFileName=dirName+“/”+fname;
update(findInstanceIdName(fullFileName));
instanceIdValues=generateInstanceIdValue(instanceId);
#打印(实例值);
对于os.walk(rootDir)中的dirName、subdirList和fileList:
对于文件列表中的fname:
outputDirName=outputDir+dirName[len(rootDir):];
os.makedirs(outputDirName,exist_uOK=True);
fullFileName=dirName+“/”+fname;
outputFileName=outputDir+fullFileName[len(rootDir):];
processFile(fullFileName、outputFileName、InstanceIdValue);

花了一些时间研究如何读取并查找该片段中的输出。。。为此构建了一个python脚本,看起来更简单。谢谢你的帮助!你的剧本很有帮助。