我提供带有多个命令和子命令的命令行工具,我使用 cobra命令行,我有两个单独的命令 这首先是先决条件其他
例如第一个命令通过创建临时文件夹并验证一些文件来选择环境
第二个命令应该从第一个命令获取一些属性
用户应该像这样执行它
btr prepare
btr run
当执行 run 命令 时,它应该从 prepare 命令输出中获取一些数据
// rootCmd represents the base command when called without any subcommands
var rootCmd = &cobra.Command{
Use: "btr",
Short: "piping process",
}
var prepare = &cobra.Command{
Use: "pre",
Short: "Prepare The environment" ,
Run: func(cmd *cobra.Command, args []string) {
//This creating the temp folder and validate some configuration file
tmpFolderPath,parsedFile := exe.PreProcess()
},
}
var initProcess = &cobra.Command{
Use: “run”,
Short: “run process”,
Run: func(cmd *cobra.Command, args []string) {
//Here I need those two properties
run(tmpFolderPath, ParsedFile)
},
}
func init() {
rootCmd.AddCommand(prepare,initProcess)
}
更新
好吧,下面的答案确实有帮助。我需要在 local & cloud env) 中的两个命令之间共享状态,如果我从调用 1 个命令然后调用第二个命令的 shell 脚本运行命令行命令,我该如何做到这一点需要从第一个命令获取一些状态,我需要 E2E 在我的上下文中使用代码示例的解决方案
更新 2
假设我知道我需要配置文件 (json),
Where should I create it (path)?
When to clean it ?
in case I use 1file How should I validate to store data which is relevant for specific process and take other process data when needed (guid ) ?
假设我的配置如下
type config struct{
path string,
wd string,
id string,//guid?
}
最佳答案
就像评论中所说的那样,如果您需要跨命令共享数据,则需要保留它。您使用的结构无关紧要,但为了简单起见,并且由于 JSON 是当前扩展性最强的数据交换语言,我们将使用它。
我的建议是使用用户的家。许多应用程序将其配置保存在这里。这将允许一个解决方案轻松实现多环境。假设您的配置文件将被命名为 myApp。
func configPath() string {
cfgFile := ".myApp"
usr, _ := user.Current()
return path.Join(usr.HomeDir, cfgFile)
}
这显然取决于您的要求。但是,如果您总是需要按此顺序运行 pre 和 run,我敢打赌您可以在 run 执行后立即清理它,当它将不再需要。
这很简单。如果您需要保存的是您的 config 结构,您可以这样做:
func saveConfig(c config) {
jsonC, _ := json.Marshal(c)
ioutil.WriteFile(configPath(), jsonC, os.ModeAppend)
}
func readConfig() config {
data, _ := ioutil.ReadFile(configPath())
var cfg config
json.Unmarshal(data, &cfg)
return cfg
}
// pre command
// persist to file the data you need
saveConfig(config{
id: "id",
path: "path",
wd: "wd",
})
// run command
// retrieve the previously stored information
cfg := readConfig()
// from now you can use the data generated by `pre`
DISCLAIMER: I've removed all error handling for short.
关于go - 从单独的命令/进程共享属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49974998/
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions
所以这可能有点令人困惑,但请耐心等待。简而言之,我想遍历具有特定键值的所有属性,然后如果值不为空,则将它们插入到模板中。这是我的代码:属性:#===DefaultfileConfigurations#default['elasticsearch']['default']['ES_USER']=''default['elasticsearch']['default']['ES_GROUP']=''default['elasticsearch']['default']['ES_HEAP_SIZE']=''default['elasticsearch']['default']['MAX_OP