gormt icon indicating copy to clipboard operation
gormt copied to clipboard

如何制定config.yml文件?

Open SidKwok opened this issue 3 years ago • 7 comments

例如我想指定到./conf/gormt.yml

SidKwok avatar Apr 29 '21 09:04 SidKwok

目前不能指定: 规则是先找可执行程序所在目录,再找执行目录 image

xxjwxc avatar Apr 29 '21 09:04 xxjwxc

可以加个flag指定吗?如果没有flag走原本的逻辑就好

SidKwok avatar Apr 29 '21 09:04 SidKwok

这个主要是希望能够收敛所有配置文件到./conf下,因为这个叫做db_gen的配置文件叫config.yml,感觉对于项目来说不是很合适

SidKwok avatar Apr 29 '21 09:04 SidKwok

你可以整体将可执行文件放到./conf目录下,然后指定生成目录。我目前是这样做的。 image

xxjwxc avatar Apr 29 '21 09:04 xxjwxc

你可以整体将可执行文件放到./conf目录下,然后指定生成目录。我目前是这样做的。 image @xxjwxc

可以加一个指定配置文件项的flag,建议直接接入viper它自动帮我们搞定配置文件。 项目目录有严格规范的情况下辅助工具和项目存放一起会变成问题的。 毕竟虽然它给我们生成了很多必要东西,但它还是外接工具。

SilvaQ avatar Sep 13 '21 08:09 SilvaQ

好的,我评估一下,好的建议其实可以的viper目前没用过,要看下基本规则

xxjwxc avatar Sep 13 '21 09:09 xxjwxc

好的,我评估一下,好的建议其实可以的viper目前没用过,要看下基本规则

这里我留下我自己用的命令行+viper的配置,望你有所帮助:

// root go

package cmd

import (
	"github.com/spf13/cobra"
	"uCorrector/config"
	"uCorrector/tools/uANSI"

	"github.com/spf13/viper"
)

var cfgFile string

// RootCmd represents the base command when called without any subcommands
var RootCmd = &cobra.Command{
	Use:   "uCli",
	Short: "校对器",
	Long:  `此命令适用于使用基于命令行的 u 语言校对,以及相关逻辑的处理,如:数据加载,清空,校对给定网页、文件等`,
	Args:  cobra.NoArgs,
}

func Execute() {
	cobra.CheckErr(RootCmd.Execute())
}

func init() {
	cobra.OnInitialize(initConfig)
	RootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.u-corrector.yaml)")
	RootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}

func initConfig() {
	if cfgFile != "" {
		uANSI.WhitePrintLn("用户制定了配置文件:", cfgFile)
		viper.SetConfigFile(cfgFile) // 使用用户指定的配置文件
	} else {
		config.InitViper() // 初始化配置
	}

	viper.AutomaticEnv()

	if err := viper.ReadInConfig(); err == nil {
		uANSI.WhitePrintLn("系统正在使用配置文件 ", viper.ConfigFileUsed())
	} else {
		uANSI.YellowPrintLn("没有找到配置文件,部分依赖配置的命令可能会出错",err)
	}
}

// config/viper.go

package config

import (
	"fmt"
	"github.com/spf13/viper"
	"os"
	"os/signal"
	"syscall"
	"uCorrector/tools/uANSI"
)

func InitViper() {
	// 仅当配置文件没有指定了才会去尝试着找一个配置
	if viper.ConfigFileUsed() == "" {

		homeDir, err := os.UserHomeDir()
		if err != nil {
			fmt.Println("获取UserHomeDir异常", err)
		}
		userConfigDir, err := os.UserConfigDir()
		if err != nil {
			fmt.Println("获取UserConfigDir异常", err)
		}

		viper.AddConfigPath(".")
		viper.AddConfigPath("./config")
		viper.AddConfigPath(homeDir)
		viper.AddConfigPath(userConfigDir)
		viper.SetConfigName(".u-corrector.yaml")
		viper.SetConfigType("yaml")

		if err := viper.ReadInConfig(); err != nil {
			if _, ok := err.(viper.ConfigFileNotFoundError); ok {
				uANSI.RedPrintLn("配置文件没找到")
				uANSI.YellowPrintLn("服务需要重启,请按住Ctrl+C 退出")
			} else {
				fmt.Println("viper 初始化遇到未知异常", err)
			}
			quit := make(chan os.Signal)
			signal.Notify(quit, syscall.SIGTERM, syscall.SIGKILL)
			os.Exit(0)
		} else {
			uANSI.WhitePrintLn("viper 正在使用配置文件: ", viper.ConfigFileUsed())
		}
	} else {
		uANSI.WhitePrintLn("viper 正在使用配置文件:", viper.ConfigFileUsed())
	}
}

SilvaQ avatar Sep 13 '21 09:09 SilvaQ