導航:首頁 > 文件管理 > clashyaml配置文件

clashyaml配置文件

發布時間:2023-04-04 17:15:48

『壹』 yaml配置文件的@project.name@不識別

直接在根目錄陵輪的pom文件的build下面添加如下配旦攜置尺遲信即可。

在yaml文件配置即可

『貳』 C語言操作yaml配置文件通用操作工具

在go語言中使用viper之類的庫很方便的處理yaml配置文件,但是在c語言中就比較麻煩,經過一番思索和藉助強大的github,發現了一個libyaml c庫,但是網上的例子都比較麻煩,而且比較繁瑣,就想法作了一個相對比較容易配置的解析應用,可以簡單地類似viper 的模式進行配置實現不同的配置文件讀取。如你的配置文件很復雜請按格式修改KeyValue 全局變數,歡迎大家一起完善

庫請自行下載 GitHub - yaml/libyaml: Canonical source repository for LibYAML

直接上代碼

yaml示例文件

%YAML 1.1

---

mqtt:

subtopic: "Control/#"

pubtopic: "bbt"

qos: 1

serveraddress: "tcp://192.168.0.25:1883"

clientid: "kvm_test"

writelog: false

writetodisk: false

outputfile: "./receivedMessages.txt"

hearttime: 30

#ifndef __CONFIG_H__

#define __CONFIG_H__

#ifdef __cplusplus

extern "C" {

#endif

/************************/

/* Minimum YAML version */

/************************/

#define YAML_VERSION_MAJOR 1

#define YAML_VERSION_MINOR 1

#define STRUCT_TYPE_NAME 100

#define INT_TYPE_NAME 101

#define STRING_TYPE_NAME 102

#define BOOL_TYPE_NAME 103

#define FLOAT_TYPE_NAME 104

#define MAP_TYPE_NAME 105

#define LIST_TYPE_NAME 106

typedef struct{

char *key;

void *value;

int valuetype;

char *parent;

}KeyValue,*pKeyValue;

#ifdef __cplusplus

}

#endif

#endif

#include

#include

#include

#include

#include

#include

#include

#include "config.h"

typedef struct {

char *SUBTOPIC; //string `yaml:"subtopic" mapstructure:"subtopic"` //"topic1"

char *PUBTOPIC; //string `yaml:"pubtopic" mapstructure:"pubtopic"`

int QOS; //byte `yaml:"qos" mapstructure:"qos"` //1

char *SERVERADDRESS; //string `yaml:"serveraddress" mapstructure:"serveraddress"` //= "tcp://mosquitto:1883"

char *CLIENTID; //string `yaml:"clientid" mapstructure:"clientid"` //= "mqtt_subscriber"

int HEARTTIME; //int `yaml:"hearttime" mapstructure:"hearttime"`

// CommandLocalPath string `yam:"commanlocalpath"`

}mqttSection,*pmqttSection;

typedef struct {

mqttSection Mqtt;// `yaml:"mqtt" mapstructure:"mqtt"`

// KVM kvmSection `yaml:"kvm" mapstructure:"kvm"`

}ConfigT;

ConfigT config;

static KeyValue webrtcconfig[]={

{"mqtt",&config,STRUCT_TYPE_NAME,NULL},

{"subtopic",&(config.Mqtt.SUBTOPIC),STRING_TYPE_NAME,"mqtt"},

{"pubtopic",&(config.Mqtt.PUBTOPIC),STRING_TYPE_NAME,"mqtt"},

{"qos",&(config.Mqtt.QOS),INT_TYPE_NAME,"mqtt"},

{"serveraddress",&(config.Mqtt.SERVERADDRESS),STRING_TYPE_NAME,"mqtt"},

{"clientid",&(config.Mqtt.CLIENTID),STRING_TYPE_NAME,"mqtt"},

{"hearttime",&(config.Mqtt.HEARTTIME),INT_TYPE_NAME,"mqtt"},

{NULL,NULL,0,NULL},

};

int printConfig(ConfigT * pconfig){

if(pconfig==NULL) return -1;

printf("mqtt:r ");

if(pconfig->Mqtt.SUBTOPIC!=NULL) {printf("subtopic: %sr ",pconfig->Mqtt.SUBTOPIC); }

if(pconfig->Mqtt.SUBTOPIC!=NULL) {printf("pubtopic: %sr ",pconfig->Mqtt.PUBTOPIC); }

printf("qos: %dr ",config.Mqtt.QOS);

if(pconfig->Mqtt.SERVERADDRESS!=NULL) {printf("serveraddress: %sr ",pconfig->Mqtt.SERVERADDRESS); }

if(pconfig->Mqtt.CLIENTID!=NULL) {printf("clientid: %sr ",pconfig->Mqtt.CLIENTID); }

printf("hearttime: %dr ",config.Mqtt.HEARTTIME);

}

int freeConfig(ConfigT * pconfig){

if(pconfig==NULL) return -1;

if(pconfig->Mqtt.SERVERADDRESS!=NULL) {free(pconfig->Mqtt.SERVERADDRESS); }

if(pconfig->Mqtt.CLIENTID!=NULL) {free(pconfig->Mqtt.CLIENTID); }

if(pconfig->Mqtt.SUBTOPIC!=NULL) {free(pconfig->Mqtt.SUBTOPIC); }

}

char currentkey[100];

void getvalue(yaml_event_t event,pKeyValue *ppconfigs){

char *value = (char *)event.data.scalar.value;

pKeyValue pconfig=*ppconfigs;

char *pstringname;

while(pconfig->key!=NULL){

if(currentkey[0]!=0){

if(!strcmp(currentkey,pconfig->key))

{

switch(pconfig->valuetype){

case STRING_TYPE_NAME:

pstringname=strp(value);

printf("get string value %sr ",pstringname);

*((char**)pconfig->value)=pstringname;

memset(currentkey, 0, sizeof(currentkey));

break;

case INT_TYPE_NAME:

*((int*)(pconfig->value))=atoi(value);

memset(currentkey, 0, sizeof(currentkey));

break;

case BOOL_TYPE_NAME:

if(!strcmp(value,"true")) *((bool*)(pconfig->value))=true;

else *((bool*)(pconfig->value))=false;

memset(currentkey, 0, sizeof(currentkey));

break;

case FLOAT_TYPE_NAME:

*((float*)(pconfig->value))=atof(value);

memset(currentkey, 0, sizeof(currentkey));

break;

case STRUCT_TYPE_NAME:

case MAP_TYPE_NAME:

case LIST_TYPE_NAME:

memset(currentkey, 0, sizeof(currentkey));

strncpy(currentkey,value,strlen(value));

break;

default:

break;

}

break;

}

//continue;

}else{

if(!strcmp(value,pconfig->key)){

strncpy(currentkey,pconfig->key,strlen(pconfig->key));

break;

}

}

pconfig++;

}

}

int Load_YAML_Config( char *yaml_file, KeyValue *(configs[]) )

{

struct stat filecheck;

yaml_parser_t parser;

yaml_event_t event;

bool done = 0;

unsigned char type = 0;

unsigned char sub_type = 0;

if (stat(yaml_file, &filecheck) != false )

{

printf("[%s, line %d] Cannot open configuration file '%s'! %s", __FILE__, __LINE__, yaml_file, strerror(errno) );

return -1;

}

FILE *fh = fopen(yaml_file, "r");

if (!yaml_parser_initialize(&parser))

{

printf("[%s, line %d] Failed to initialize the libyaml parser. Abort!", __FILE__, __LINE__);

return -1;

}

if (fh == NULL)

{

printf("[%s, line %d] Failed to open the configuration file '%s' Abort!", __FILE__, __LINE__, yaml_file);

return -1;

}

memset(currentkey, 0, sizeof(currentkey));

/* Set input file */

yaml_parser_set_input_file(&parser, fh);

while(!done)

{

if (!yaml_parser_parse(&parser, &event))

{

/* Useful YAML vars: parser.context_mark.line+1, parser.context_mark.column+1, parser.problem, parser.problem_mark.line+1, parser.problem_mark.column+1 */

printf( "[%s, line %d] libyam parse error at line %ld in '%s'", __FILE__, __LINE__, parser.problem_mark.line+1, yaml_file);

}

if ( event.type == YAML_DOCUMENT_START_EVENT )

{

//yaml file first line is version

//%YAML 1.1

//---

yaml_version_directive_t *ver = event.data.document_start.version_directive;

if ( ver == NULL )

{

printf( "[%s, line %d] Invalid configuration file. Configuration must start with "%%YAML 1.1"", __FILE__, __LINE__);

}

int major = ver->major;

int minor = ver->minor;

if (! (major == YAML_VERSION_MAJOR && minor == YAML_VERSION_MINOR) )

{

printf( "[%s, line %d] Configuration has a invalid YAML version. Must be 1.1 or above", __FILE__, __LINE__);

return -1;

}

}

else if ( event.type == YAML_STREAM_END_EVENT )

{

done = true;

}

else if ( event.type == YAML_MAPPING_END_EVENT )

{

sub_type = 0;

}

else if ( event.type == YAML_SCALAR_EVENT )

{

getvalue(event,configs);

}

}

return 0;

}

int main(int argc, char *argv[]){

pKeyValue pconfig=&webrtcconfig[0];

Load_YAML_Config("../../etc/kvmagent.yml",&pconfig);

printConfig(&config);

freeConfig(&config);

}

『叄』 2020-06-15關於iOS 使用yaml配置文件總結

yaml,json,ini這三種格式用來做配置文件優缺點
適合人類編寫:ini > toml > yaml > json > xml > plist
可以存儲的數據復雜度:xml > yaml > toml ~ json ~ plist > ini

yaml解析庫: https://github.com/mirek/YAML.framework

編譯導出iOS版本的framwork, YAML.framework
導入進你的iOS工程,這里有個坑

但是發現雖然不報錯了,但是解析不出數據

里,然後就可以正常使用了

結果

附上yaml格式文件的編寫規則: https://www.jianshu.com/p/5d7cc8690f15

它的基本語法規則如下:

大小寫敏感
使用縮進表示層級關系
縮進時不允許使用Tab鍵,只允許使用空格。
縮進的空格數目不重要,只要相同層級的元素左側對齊即可

純量是最基本的、不可再分的值。以下數據類型都屬於 JavaScript 的純量。

後面引用和正則表達式是一些語法,參 https://blog.csdn.net/michaelhan3/article/details/69664932

『肆』 calsh無法啟動主程序

calsh無法啟動主程序?首先是我的解決方法,直接關閉windows防火牆,如果你不想關閉也可以採用以下方法:

打開windows安全喊雀中心首滲閉--防火牆與網路保護--允許應用通過防火牆--更改設置--允許其他應用--瀏覽--選擇clash目錄下的resources\static\files\win\x64\clash-win64.exe--點添加

我是win10系統,其他系統沒測試。

2.如果還不行,設置那一欄有個Secret核心,點更新,重新導入訂閱的URL鏈接。

3.clash 啟動失敗,者裂顯示Parse config error: proxy 0: TLS must be true with h2/grpc network

clash 的 vmess的H2添加伺服器裡面沒有 TLS的選項,所以啟動不起來
在yaml文件 添加一個 tls的設置。

4.關閉殺毒軟體,以管理員方式運行。

5.埠被佔用了,參考 https://blog.51cto.com/u_15127578/4207165 這位大佬得心得!

『伍』 YAML 配置文件語言

YAML 是專門用來寫配置文件的語言,非常簡潔和強大,遠比 JSON 格式方便。YAML 語言的設計目標,就是方便人類讀寫。它實質上是一種通用的數據串列化格式。它的基本語法規則如下:

對象的一組鍵值對,使用冒號結構表示

一組連詞線開頭的行,構成一個數組

數據結構的子成員是一個數組,則可以在該項下面縮進一個空格

對象和數組可以結合使用,形成復合結構

純量是最基本的、不可再分的值。以下數據類型都屬於 JavaScript 的純量

課程演示會採用多虛擬機模擬分布式場景,為防止 IP 沖突,無法聯網等問題,需要預先設置好主機名、IP、DNS 配置

修改 cloud.cfg 防止重啟後主機名還原

修改主機名

編輯 vi /etc/netplan/50-cloud-init.yaml 配置文件,修改內容如下

使用 netplan apply 命令讓配置生效

『陸』 glados使用linux

glados支持Linux和網關路由器等全平台客戶端。
從中選擇適合自己設備的版本,以下以臘哪神clash-linux-amd64-v1.8.0.gz為例。將准備緩激好的yaml文件(如config.yaml)復制到clash的目錄。
即可啟動clash,啟動後還需要更改系統代理,默認情況下的地址和埠,參數是指定config的位置,由於將config.yaml放在了clash目錄下,因此輪虧需要指定當前工作目錄為config位置。

『柒』 Golang項目中引入yaml.v2配置文件

在Go語言項目中,常用的配置文件yaml、toml、json、xml、ini幾種,因為本章主要講解yaml配置文件的使用方法,其他幾種配置文件在這里就不展開了介紹了,大家有興趣可以自行網路。
yaml文件的語法網上有很多的教程,大家自行網路,這里也推薦兩個鏈接:

yaml文件解析使用的是github上第三方開源框架 gopkg.in/yaml.v2 ,下面詳細介紹安裝和使用的方法:

參考鏈接: https://blog.csdn.net/wade3015/article/details/83351776

『捌』 SpringBoot中yaml文件配置屬性

首先,在SpringBoot中,有兩種配置文件的方式。一種是application.properties,另一種application.yaml(或者是application.yml)。
yaml文件格式是SpringBoot支持的一種JSON超集文件格式,相對於傳統的Properties配置文件,yaml文件以數據為核心,是一種更為直觀且容易被計算機識別的數據序列化格式。application.yaml配置文件的工作原理和application.properties是一樣的,只是yaml格式配置文件看起來要跟簡潔一些。
application.yaml文件使用 key:(空格) value 格式配置屬性,使用縮進控制層關系

注意:此時port和path屬性,屬於同一層級

其中縮進式寫法有兩種表示形式,一種為:

另一種為:

上述兩種縮進式寫法為person對象的hobby屬性賦值,其中一種是通過「-(空格)屬性值」的形式為屬性賦值,另一種是直接賦值使用英文逗號分隔屬性值。

行內式的寫法顯然比縮進式寫法更加簡潔。使用行內式寫法設置屬性值時,中括弧「[ ]」是可以省略的,程序會自動匹配校對屬性的值

在yaml配置的屬性值為Map或對象類型時,縮進式的形式按照yaml文件格式編寫即可,而行內式寫法的屬性值要用大括弧「{ }」包含

『玖』 shellclash清理配置文件

config.yaml:clash基礎配置文件。
默認安裝目錄為/etc/clash,可手動指定任意目錄安裝,安裝完成後可以使用echo$clashdir命令查詢安裝目錄。目錄包含以下文件:1、clash:clash核心文件。
2、clash.sh/start.sh/getdate.sh:ShellClash運行腳本文件。
3、Country.mmdb:Geoip資料庫文件。
4、config.yaml:clash基礎配置文件。
5、config.yaml.bak:clash配置文件備份。
6、mark:腳本運行配置文件。
7、mac:腳本mac過濾功能配置文件等。

『拾』 使用yaml文件管理測試數據

知道ddt的基本使用方法之後,練習把之前用excel文件來維護的介面測試用例改用unittest+ddt來實現。

這里我選用yaml文件來管理介面參數,開始本來想用json,但是json無法添加註釋,可讀性不好。

下面截圖是介面文檔中的各個介面,每個介面都有一個固定的序號,所以在設計每個介面的測試數據時,以序號來區分不同介面

yaml文件內容如下,需要注意的是yaml的語法:

(1)鍵值對用冒號分割,但是冒號後需要加一個空格

(2)禁止使用tab縮進,只能使用空格鍵;縮進長度沒有限制,只要元素對齊就表示這些元素屬於一個層級

(3)字元串可以不用引號標注,也可以加引號,如果想把數字變為字元串,加引號即可

(4)使用#表示注釋

詳情可以參考博客: https://blog.csdn.net/vincent_hbl/article/details/75411243

2. 簡單 demo : python 讀取 yaml 文件,取出介面參數

import yaml

fp = open('../dataconfig/信息互動模塊介面.yaml', encoding='utf-8')   #有中文字元的話,加編碼格式

                testdata = yaml.load(fp)

t = testdata['5.2.1.4']

print(t)

(1)封裝讀取yaml文件方法

handle_yaml.py

# coding: utf-8

# author: hmk

importyaml

importos

classHandleYaml:

    def __init__(self,file_path=None):

        if file_path:

           self.file_path = file_path

        else:

            root_dir =os.path.dirname(os.path.abspath('.'))

            # os.path.abspath('.')表示獲取當前文件所在目錄;os.path.dirname表示獲取文件所在父目錄;所以整個就是項目的所在路徑self.file_path = root_dir +'/dataconfig/信息互動模塊介面.yaml'  #獲取文件所在的相對路徑(相對整個項目)

        #elf.data = self.get_data()

    def get_data(self):

        fp =open(self.file_path, encoding='utf-8')

        data =yaml.load(fp)

        return data

if __name__ == '__main__':

    test = HandleYaml()

    p = test.get_data()

    print(p['5.2.1.1'])

[if !vml][endif]

(2)封裝requests請求方法

[if !vml][endif]

# coding: utf-8

# author: Archer

importrequests

importjson

classRunMethod:

    defpost_main(self, url, data, header=None):if header is notNone:

             res =requests.post(url=url, data=data, headers=header)

        else:

            res =requests.post(url=url, data=data)

        # print(res.status_code)

        # return res.json()

        return res    #為了方便後面斷言,這里不再對伺服器響應進行json格式編碼

def get_main(self, url, data=None, header=None):if header is notNone:

            res =requests.get(url=url, params=data, headers=header)

        else:

            res =requests.get(url=url, params=data)

            print(res.status_code)

        # return

res.json()

        return res

    def run_main(self, method, url, data=None, header=None):

    if method== 'POST':

            res =self.post_main(url, data, header)

        else:

            res =self.get_main(url, data, header)

        returnres

        # returnjson.mps(res, indent=2, sort_keys=False, ensure_ascii=False)  #使用json模塊格式化顯示結果

[if !vml][endif]

(3)一個介面測試用例

[if !vml][endif]

# coding: utf-8

# author: Archer

importunittest

importddt

from base.run_method importRunMethod

from utils.handle_yaml importHandleYaml

get_data = HandleYaml()  # 從yaml文件中取出該介面的參數

params = get_data.get_data()['5.2.1.4']

@ddt.ddt

classTest(unittest.TestCase):

    """載入咨詢詳情介面"""

    defsetUp(self):

        self.url ='http://localhost:8088/ApprExclusiveInterface/api/enterprise/info/consult/loadDetail.v'

        self.run =RunMethod()

    @ddt.data(*params)

    deftest(self, value):

        r =self.run.run_main("GET", self.url, value)

        print(r)

       self.assertTrue(value['assert'] inr.text)

if __name__ == '__main__':

    unittest.main()

(4)利用HTMLTestRunner生成測試報告

run_report.py

# coding: utf-8

# author: hmk

from HTMLTestRunner importHTMLTestRunner

importunittest

importtime, os

root_dir = os.path.dirname(os.path.abspath('.'))  # 獲取當前文件所在目錄的父目錄的絕對路徑,也就是項目所在路徑E:\DDT_Interface

case_dir = root_dir + '/test_case/'  # 根據項目所在路徑,找到用例所在的相對項目的路徑

print(root_dir)

print(case_dir)

"""定義discover方法"""

discover = unittest.defaultTestLoader.discover(case_dir,

pattern='test*.py', top_level_dir=None)

"""

1.case_dir即測試用例所在目錄

2.pattern='test_*.py' :表示用例文件名的匹配原則,「*」表示任意多個字元

3.top_level_dir=None:測試模塊的頂層目錄。如果沒頂層目錄(也就是說測試用例不是放在多級目錄中),默認為None

"""

if __name__ == "__main__":

    """直接載入discover"""

    now = time.strftime("%Y-%m-%d%H_%M_%S")

    filename = root_dir +'/report/' + now + '_result.html'  #定義報告存放路徑

    print(filename)

    fp = open(filename,'wb')

    runner =HTMLTestRunner(stream=fp, title='個人網企業網介面測試報告', description='測試結果如下: ')

    runner.run(discover)

    fp.close()

ok ,unittest+ddt進行介面測試就完成了,還有很多不足,yaml配置文件還可以繼續設計優化,例如可以把請求url也加進去。

其實感覺如何設計測試用例,組織測試數據也是一件很有意思的事情,很多事情都必須先有一個良好的設計思路才會進行的更順暢。總之勤於思考,多參考他人的思路。不是有句話嗎,學而不思則罔,思而不學則殆。

閱讀全文

與clashyaml配置文件相關的資料

熱點內容
如何卸載兩步路app 瀏覽:97
lol壓縮文件 瀏覽:555
小蘋果安淇爾寫真集 瀏覽:16
word設置修改文件密碼 瀏覽:465
ug編程怎麼攻螺紋 瀏覽:631
飄零網路驗證40模塊源碼 瀏覽:635
怎麼把微信裡面app顯示到桌面 瀏覽:590
我想在桌面新建一個文件夾 瀏覽:756
videojs蘋果無法播放 瀏覽:496
vivo手機怎麼桌面建文件夾 瀏覽:429
液壓控制模塊怎麼編程 瀏覽:249
word加下劃線顏色 瀏覽:425
g71的編程應用怎麼操作 瀏覽:100
切換文件目錄linux 瀏覽:286
同步壓縮文件內容 瀏覽:866
諸城中考查詢網站的密碼是什麼 瀏覽:615
怎麼自動讀取usb數據 瀏覽:944
自如app如何看戶型圖 瀏覽:511
一般程序編程對機子配置要求如何 瀏覽:43
拉伸實驗數據出現水平是什麼原因 瀏覽:615

友情鏈接