github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/cmd/geth/usage.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:32</date> 10 //</624450068874792960> 11 12 13 //包含geth命令用法模板和生成器。 14 15 package main 16 17 import ( 18 "io" 19 "sort" 20 21 "strings" 22 23 "github.com/ethereum/go-ethereum/cmd/utils" 24 "github.com/ethereum/go-ethereum/internal/debug" 25 "gopkg.in/urfave/cli.v1" 26 ) 27 28 //AppHelpTemplate是默认全局应用程序帮助主题的测试模板。 29 var AppHelpTemplate = `NAME: 30 {{.App.Name}} - {{.App.Usage}} 31 32 Copyright 2013-2019 The go-ethereum Authors 33 34 USAGE: 35 {{.App.HelpName}} [options]{{if .App.Commands}} command [command options]{{end}} {{if .App.ArgsUsage}}{{.App.ArgsUsage}}{{else}}[arguments...]{{end}} 36 {{if .App.Version}} 37 VERSION: 38 {{.App.Version}} 39 {{end}}{{if len .App.Authors}} 40 AUTHOR(S): 41 {{range .App.Authors}}{{ . }}{{end}} 42 {{end}}{{if .App.Commands}} 43 COMMANDS: 44 {{range .App.Commands}}{{join .Names ", "}}{{ "\t" }}{{.Usage}} 45 {{end}}{{end}}{{if .FlagGroups}} 46 {{range .FlagGroups}}{{.Name}} OPTIONS: 47 {{range .Flags}}{{.}} 48 {{end}} 49 {{end}}{{end}}{{if .App.Copyright }} 50 COPYRIGHT: 51 {{.App.Copyright}} 52 {{end}} 53 ` 54 55 //FlagGroup是属于单个主题的标志集合。 56 type flagGroup struct { 57 Name string 58 Flags []cli.Flag 59 } 60 61 //AppHelpFlagGroups是按功能分组的应用程序标志。 62 var AppHelpFlagGroups = []flagGroup{ 63 { 64 Name: "ETHEREUM", 65 Flags: []cli.Flag{ 66 configFileFlag, 67 utils.DataDirFlag, 68 utils.KeyStoreDirFlag, 69 utils.NoUSBFlag, 70 utils.NetworkIdFlag, 71 utils.TestnetFlag, 72 utils.RinkebyFlag, 73 utils.SyncModeFlag, 74 utils.GCModeFlag, 75 utils.EthStatsURLFlag, 76 utils.IdentityFlag, 77 utils.LightServFlag, 78 utils.LightPeersFlag, 79 utils.LightKDFFlag, 80 utils.WhitelistFlag, 81 }, 82 }, 83 { 84 Name: "DEVELOPER CHAIN", 85 Flags: []cli.Flag{ 86 utils.DeveloperFlag, 87 utils.DeveloperPeriodFlag, 88 }, 89 }, 90 { 91 Name: "ETHASH", 92 Flags: []cli.Flag{ 93 utils.EthashCacheDirFlag, 94 utils.EthashCachesInMemoryFlag, 95 utils.EthashCachesOnDiskFlag, 96 utils.EthashDatasetDirFlag, 97 utils.EthashDatasetsInMemoryFlag, 98 utils.EthashDatasetsOnDiskFlag, 99 }, 100 }, 101 //{ 102 //名称:“仪表板”, 103 //标志:[]cli.flag_ 104 //utils.dashboard启用的标志, 105 //实用程序。仪表板添加标记, 106 //utils.dashboardportflag, 107 //utils.dashboard刷新标记, 108 //utils.dashboardassetsflag, 109 //} 110 //} 111 { 112 Name: "TRANSACTION POOL", 113 Flags: []cli.Flag{ 114 utils.TxPoolLocalsFlag, 115 utils.TxPoolNoLocalsFlag, 116 utils.TxPoolJournalFlag, 117 utils.TxPoolRejournalFlag, 118 utils.TxPoolPriceLimitFlag, 119 utils.TxPoolPriceBumpFlag, 120 utils.TxPoolAccountSlotsFlag, 121 utils.TxPoolGlobalSlotsFlag, 122 utils.TxPoolAccountQueueFlag, 123 utils.TxPoolGlobalQueueFlag, 124 utils.TxPoolLifetimeFlag, 125 }, 126 }, 127 { 128 Name: "PERFORMANCE TUNING", 129 Flags: []cli.Flag{ 130 utils.CacheFlag, 131 utils.CacheDatabaseFlag, 132 utils.CacheTrieFlag, 133 utils.CacheGCFlag, 134 utils.TrieCacheGenFlag, 135 }, 136 }, 137 { 138 Name: "ACCOUNT", 139 Flags: []cli.Flag{ 140 utils.UnlockedAccountFlag, 141 utils.PasswordFileFlag, 142 }, 143 }, 144 { 145 Name: "API AND CONSOLE", 146 Flags: []cli.Flag{ 147 utils.RPCEnabledFlag, 148 utils.RPCListenAddrFlag, 149 utils.RPCPortFlag, 150 utils.RPCApiFlag, 151 utils.WSEnabledFlag, 152 utils.WSListenAddrFlag, 153 utils.WSPortFlag, 154 utils.WSApiFlag, 155 utils.WSAllowedOriginsFlag, 156 utils.IPCDisabledFlag, 157 utils.IPCPathFlag, 158 utils.RPCCORSDomainFlag, 159 utils.RPCVirtualHostsFlag, 160 utils.JSpathFlag, 161 utils.ExecFlag, 162 utils.PreloadJSFlag, 163 }, 164 }, 165 { 166 Name: "NETWORKING", 167 Flags: []cli.Flag{ 168 utils.BootnodesFlag, 169 utils.BootnodesV4Flag, 170 utils.BootnodesV5Flag, 171 utils.ListenPortFlag, 172 utils.MaxPeersFlag, 173 utils.MaxPendingPeersFlag, 174 utils.NATFlag, 175 utils.NoDiscoverFlag, 176 utils.DiscoveryV5Flag, 177 utils.NetrestrictFlag, 178 utils.NodeKeyFileFlag, 179 utils.NodeKeyHexFlag, 180 }, 181 }, 182 { 183 Name: "MINER", 184 Flags: []cli.Flag{ 185 utils.MiningEnabledFlag, 186 utils.MinerThreadsFlag, 187 utils.MinerNotifyFlag, 188 utils.MinerGasPriceFlag, 189 utils.MinerGasTargetFlag, 190 utils.MinerGasLimitFlag, 191 utils.MinerEtherbaseFlag, 192 utils.MinerExtraDataFlag, 193 utils.MinerRecommitIntervalFlag, 194 utils.MinerNoVerfiyFlag, 195 }, 196 }, 197 { 198 Name: "GAS PRICE ORACLE", 199 Flags: []cli.Flag{ 200 utils.GpoBlocksFlag, 201 utils.GpoPercentileFlag, 202 }, 203 }, 204 { 205 Name: "VIRTUAL MACHINE", 206 Flags: []cli.Flag{ 207 utils.VMEnableDebugFlag, 208 utils.EVMInterpreterFlag, 209 utils.EWASMInterpreterFlag, 210 }, 211 }, 212 { 213 Name: "LOGGING AND DEBUGGING", 214 Flags: append([]cli.Flag{ 215 utils.FakePoWFlag, 216 utils.NoCompactionFlag, 217 }, debug.Flags...), 218 }, 219 { 220 Name: "METRICS AND STATS", 221 Flags: []cli.Flag{ 222 utils.MetricsEnabledFlag, 223 utils.MetricsEnableInfluxDBFlag, 224 utils.MetricsInfluxDBEndpointFlag, 225 utils.MetricsInfluxDBDatabaseFlag, 226 utils.MetricsInfluxDBUsernameFlag, 227 utils.MetricsInfluxDBPasswordFlag, 228 utils.MetricsInfluxDBHostTagFlag, 229 }, 230 }, 231 { 232 Name: "WHISPER (EXPERIMENTAL)", 233 Flags: whisperFlags, 234 }, 235 { 236 Name: "DEPRECATED", 237 Flags: []cli.Flag{ 238 utils.MinerLegacyThreadsFlag, 239 utils.MinerLegacyGasTargetFlag, 240 utils.MinerLegacyGasPriceFlag, 241 utils.MinerLegacyEtherbaseFlag, 242 utils.MinerLegacyExtraDataFlag, 243 }, 244 }, 245 { 246 Name: "MISC", 247 }, 248 } 249 250 //ByCategory按顺序按名称对FlagGroup数组排序 251 //在AppHelpFlagGroups中定义。 252 type byCategory []flagGroup 253 254 func (a byCategory) Len() int { return len(a) } 255 func (a byCategory) Swap(i, j int) { a[i], a[j] = a[j], a[i] } 256 func (a byCategory) Less(i, j int) bool { 257 iCat, jCat := a[i].Name, a[j].Name 258 iIdx, jIdx := len(AppHelpFlagGroups), len(AppHelpFlagGroups) //确保非分类标志排在最后 259 260 for i, group := range AppHelpFlagGroups { 261 if iCat == group.Name { 262 iIdx = i 263 } 264 if jCat == group.Name { 265 jIdx = i 266 } 267 } 268 269 return iIdx < jIdx 270 } 271 272 func flagCategory(flag cli.Flag) string { 273 for _, category := range AppHelpFlagGroups { 274 for _, flg := range category.Flags { 275 if flg.GetName() == flag.GetName() { 276 return category.Name 277 } 278 } 279 } 280 return "MISC" 281 } 282 283 func init() { 284 //覆盖默认的应用程序帮助模板 285 cli.AppHelpTemplate = AppHelpTemplate 286 287 //定义一个要传递到使用模板的一次性结构 288 type helpData struct { 289 App interface{} 290 FlagGroups []flagGroup 291 } 292 293 //覆盖默认的应用程序帮助打印机,但仅用于全局应用程序帮助 294 originalHelpPrinter := cli.HelpPrinter 295 cli.HelpPrinter = func(w io.Writer, tmpl string, data interface{}) { 296 if tmpl == AppHelpTemplate { 297 //遍历所有标志并添加任何未分类的标志 298 categorized := make(map[string]struct{}) 299 for _, group := range AppHelpFlagGroups { 300 for _, flag := range group.Flags { 301 categorized[flag.String()] = struct{}{} 302 } 303 } 304 uncategorized := []cli.Flag{} 305 for _, flag := range data.(*cli.App).Flags { 306 if _, ok := categorized[flag.String()]; !ok { 307 if strings.HasPrefix(flag.GetName(), "dashboard") { 308 continue 309 } 310 uncategorized = append(uncategorized, flag) 311 } 312 } 313 if len(uncategorized) > 0 { 314 //将所有未分类的选项附加到misc组 315 miscs := len(AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags) 316 AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags = append(AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags, uncategorized...) 317 318 //确保之后将其拆下 319 defer func() { 320 AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags = AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags[:miscs] 321 }() 322 } 323 //呈现自定义使用屏幕 324 originalHelpPrinter(w, tmpl, helpData{data, AppHelpFlagGroups}) 325 } else if tmpl == utils.CommandHelpTemplate { 326 //遍历所有特定于命令的标志并对其进行分类 327 categorized := make(map[string][]cli.Flag) 328 for _, flag := range data.(cli.Command).Flags { 329 if _, ok := categorized[flag.String()]; !ok { 330 categorized[flagCategory(flag)] = append(categorized[flagCategory(flag)], flag) 331 } 332 } 333 334 //排序以获得稳定的排序 335 sorted := make([]flagGroup, 0, len(categorized)) 336 for cat, flgs := range categorized { 337 sorted = append(sorted, flagGroup{cat, flgs}) 338 } 339 sort.Sort(byCategory(sorted)) 340 341 //将排序数组添加到数据并使用默认打印机呈现 342 originalHelpPrinter(w, tmpl, map[string]interface{}{ 343 "cmd": data, 344 "categorizedFlags": sorted, 345 }) 346 } else { 347 originalHelpPrinter(w, tmpl, data) 348 } 349 } 350 } 351