英文:
Cobra Commander: How to call a command from another command?
问题
在 cobra 中,我创建了一个命令的命令:
myapp zip -directory "xzy" -output="zipname"
myapp upload -filename="abc"
我想创建一个 zipAndUpload 命令,并重用现有的命令,即:
myapp zipup -directory "xzy" -output="zipname"
在这里,zipup 首先调用 "zip" 命令,然后使用 "zip" 命令的输出名称作为 "upload" 命令的 "filename" 标志。
如何在不重复大量代码的情况下执行这个操作?
英文:
In cobra I've create a command of commands:
myapp zip -directory "xzy" -output="zipname"
myapp upload -filename="abc"
I want to make a zipAndUpload command and reuse the existing commands, i.e.,
myapp zipup -directory "xzy" -outout="zipname"
Here the zipup would first call the "zip" command and then use the output name from the "zip" command as the "filename" flag for the "upload" command.
How can I execute this without a lot of code duplication?
答案1
得分: 4
"shared"开关变为全局。
子命令的"run"部分转换为函数。
为此,您必须手动定义命令:
var (
cfgDirectory string
cfgFilename string
cfgOutput string
)
var rootCmd = &cobra.Command{
Use: "root",
Short: "root",
Long: "root",
Run: func(cmd *cobra.Command, args []string) {
// something
},
}
var uploadCmd = &cobra.Command{
Use: "upload",
Short: "upload",
Long: "upload",
Run: func(cmd *cobra.Command, args []string) {
Upload()
},
}
var zipCmd = &cobra.Command{
Use: "zip",
Short: "zip",
Long: "zip",
Run: func(cmd *cobra.Command, args []string) {
Zip()
},
}
var zipupCmd = &cobra.Command{
Use: "zipup",
Short: "zipup",
Long: "zipup",
Run: func(cmd *cobra.Command, args []string) {
Zip()
Upload()
},
}
func setFlags() {
rootCmd.PersistentFlags().StringVar(&cfgDirectory, "directory", "", "explanation")
rootCmd.PersistentFlags().StringVar(&cfgFilename, "filename", "", "explanation")
rootCmd.PersistentFlags().StringVar(&cfgOutput, "output", "", "explanation")
}
func Upload() {
// you know what to do
}
func Zip() {
// you know what to do
}
...
// 添加子命令
rootCmd.AddCommand(zipCmd)
rootCmd.AddCommand(uploadCmd)
rootCmd.AddCommand(zipupCmd)
希望这可以帮到您,这是我在没有任何示例代码的情况下能做到的最好的翻译。
英文:
The "shared" switches make as global.
The "run" sections of the sub-commands, convert to functions.
To do this you must define the commands manually:
var (
cfgDirectory string
cfgFilename string
cfgOutput string
)
var rootCmd = &cobra.Command{
Use: "root",
Short: "root",
Long: "root",
Run: func(cmd *cobra.Command, args []string) {
// something
},
}
var uploadCmd = &cobra.Command{
Use: 'upload',
Short: 'upload',
Long: `upload`,
Run: func(cmd *cobra.Command, args []string) {
Upload()
},
}
var zipCmd = &cobra.Command{
Use: "zip",
Short: "zip",
Long: "zip",
Run: func(cmd *cobra.Command, args []string) {
Zip()
},
}
var zipupCmd = &cobra.Command{
Use: "zipup",
Short: "zipup",
Long: "zipup",
Run: func(cmd *cobra.Command, args []string) {
Zip()
Upload()
},
}
func setFlags() {
rootCmd.PersistentFlags().StringVar(&cfgDirectory, "directory", "", "explanation")
rootCmd.PersistentFlags().StringVar(&cfgFilename, "filename", "", "explanation")
rootCmd.PersistentFlags().StringVar(&cfgOutput, "output", "", "explanation")
}
func Upload() {
// you know what to do
}
func Zip() {
// you know what to do
}
...
// Add subcommands
rootCmd.AddCommand(zipCmd)
rootCmd.AddCommand(uploadCmd)
rootCmd.AddCommand(zipupCmd)
Hope this helps, this is the best I could do without any example code.
答案2
得分: 2
当您从cobra CLI创建新命令时,通常会将它们放入单独的文件中。如果您想从不同的命令文件中运行命令,代码会类似于这样:
package cmd
import "github.com/spf13/cobra"
// DirectoryFlag 指定目录
var DirectoryFlag string
// OutputFlag 指定输出
var OutputFlag string
// zipupCmd 表示"zipup"命令
var zipupCmd = &cobra.Command{
Use: "zipup",
Short: "Zip & Upload",
Long: `Zip & Upload`,
Run: func(cmd *cobra.Command, args []string) {
anyArgs := "whatever"
zipCmd.Run(cmd, []string{anyArgs})
uploadCmd.Run(cmd, []string{anyArgs})
},
}
func init() {
rootCmd.AddCommand(zipupCmd)
zipupCmd.Flags().StringVarP(&DirectoryFlag, "directory", "d", "", "设置目录")
zipupCmd.Flags().StringVarP(&OutputFlag, "output", "o", "", "设置输出")
}
英文:
When you create new commands from the cobra CLI, it usually puts them into separate files. If you want to run a command from a different command file, it would look something like this:
package cmd
import "github.com/spf13/cobra"
// DirectoryFlag specifies the directory
var DirectoryFlag string
// OutputFlag specifies the output
var OutputFlag string
// zipupCmd represents the "zipup" command
var zipupCmd = &cobra.Command{
Use: "zipup",
Short: "Zip & Upload",
Long: `Zip & Upload`,
Run: func(cmd *cobra.Command, args []string) {
anyArgs := "whatever"
zipCmd.Run(cmd, []string{anyArgs})
uploadCmd.Run(cmd, []string{anyArgs})
},
}
func init() {
rootCmd.AddCommand(zipupCmd)
zipupCmd.Flags().StringVarP(&DirectoryFlag, "directory", "d", "", "set the directory")
zipupCmd.Flags().StringVarP(&OutputFlag, "output", "o", "", "set the output")
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论