例如我正在开发留言簿。它允许添加需要主持人批准的记录。但是在开发进一步的功能时,批准在测试期间添加的每条记录是一件很痛苦的事情。 那么,是否可以构建应用程序的开发版本来创建带有适当标志集的此类记录?
例如 prod build 使用以下函数编译:
func NewRecord() Record {
return Record{Moderation: Awaiting}
}
在 dev build 中编译:
func NewRecord() Record {
return Record{Moderation: Approved}
}
我知道在前端,当你构建一些 JS 应用程序时,通常的做法是在构建生产时设置 NODE_ENV=production 环境变量。 我在 Go 中寻找类似的东西。 我看到了两种方式,但都不喜欢其中任何一种:
Awaiting = Approved,然后在构建产品版本时将其改回实际值。但我担心有一天我会忘记这个 mock,将其提交到 repo 或类似的东西。将函数改成类似的东西
func NewRecord() Record {
if os.Getenv(mykey) == "production" {
return Record{Moderation: Awaiting}
} else {
return Record{Moderation: Approved}
}
}
但我不喜欢在运行时为每条新记录评估此条件。对于编译语言来说似乎是错误的。
作为奖励,如果这样的应用程序可以显示警告(到标准输出/标准错误),如果它是作为开发版本构建的。
谢谢。
最佳答案
我个人认为使用您在示例中所做的环境变量是执行此操作的“正确”方法。这允许您在不重建应用程序的情况下调整行为,这在调试时可能非常有用。然而,如果你真的想在编译时完成它,可以用 build constraints 来完成。 .
构建约束是放置在文件顶部的特殊注释,表示“仅在满足特定条件时构建此文件”。条件可以是我们正在构建的机器架构、我们正在运行的操作系统或用户在构建时指定的自定义构建标签。
例如,您可以将您的函数调整为:
func NewRecord() Record {
return Record{Moderation: ModLevel}
}
然后定义 ModLevel 两次,一次在文件 modlevel_prod.go 中,看起来像这样(请注意,构建约束的语法正在更改,第二行是新语法,第一行不会' 有效期更长。有关更多信息,请参阅本文末尾的链接):
// +build !dev
//go:build !dev
package mypackage
const ModLevel = Awaiting
modlevel_dev.go 中的一个(或者在这种情况下,文件名无关紧要)如下所示:
// +build dev
//go:build dev
package mypackage
const ModLevel = Approved
现在,当你构建时,文件的生产版本是默认的,如果你想构建文件的开发版本,你必须明确包含构建标签:
$ go build -tags dev
编辑:构建约束的语法正在改变。我更新了示例以包括旧版本和新版本(当前共存)。参见 https://golang.org/issues/41184获取更多信息和弃用旧版本的时间表。
关于go - go 中 dev 和 prod env 的不同 const 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40178568/
我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.
RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)
A/ctohttp://wiki.nginx.org/CoreModule#usermaster进程曾经以root用户运行,是否可以以不同的用户运行nginxmaster进程? 最佳答案 只需以非root身份运行init脚本(即/etc/init.d/nginxstart),就可以用不同的用户运行nginxmaster进程。如果这真的是你想要做的,你将需要确保日志和pid目录(通常是/var/log/nginx&/var/run/nginx.pid)对该用户是可写的,并且您所有的listen调用都是针对大于1024的端口(因为绑定(
每次我尝试使用“script/runner-eproductionClassName.run”从我的Rails2.2应用程序的lib目录运行任何类时,我都会收到以下错误:/usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/commands/runner.rb:47:/usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:89:in`const_missing':uninitializedconstantClassName(NameError)
有没有办法在sinatra的beforedoblock中停止执行并返回不同的值?beforedo#codeishere#Iwouldliketo'return"Message"'#Iwouldlike"/home"tonotgetcalled.end//restofthecodeget'/home'doend 最佳答案 beforedohalt401,{'Content-Type'=>'text/plain'},'Message!'end如果你愿意,你可以只指定状态,这里有状态、标题和正文的例子
我想用sunspot重现以下原始solr查询q=exact_term_text:fooORterm_textv:foo*ORalternate_text:bar*但我无法通过标准的太阳黑子界面理解这是否可能以及如何实现,因为看起来:fulltext方法似乎不接受多个文本/搜索字段参数我不知道将什么参数作为第一个参数传递给fulltext,就好像我通过了"foo"或"bar"结果不匹配如果我传递一个空参数,我得到一个q=*:*范围过滤器(例如with(:term).starting_with('foo*')(顾名思义)作为过滤器查询应用,因此不参与评分。似乎可以手动编写字符串(或者可能使
我从ui中得到日期范围为-approved_between"=>"2013-03-17-2013-03-18"我需要拆分此approved_start_date="2013-03-17"和approved_end_date="2013-03-18"...我希望使用它在mysql中查询,因为mysql中的日期格式是created_at:2012-07-2810:35:01.我正在做的是:approved=approved_between.split("")approved_start_date=approved[0]approved_end_date=approved[2]很确定这不是处
response是一个散列,可能看起来像以下两种情况之一:response={'demo'=>'nil','test_01'=>'DemoData'}或response={'test'=>'DemoData','demo'=>'nil'}我想做这样的事情:ifresponse.has_key?'test_01'new_response.update(:nps_score=>response['test_01']elsenew_response.update(:nps_score=>response['test']end是否有更“Ruby”的方法来解决这个问题?也许使用||的东西运算符(
我正在编写一个Rails应用程序,它将监视某些特定数据库的数据质量。为了做到这一点,我需要能够对这些数据库执行直接SQL查询——这当然与用于驱动Rails应用程序模型的数据库不同。简而言之,这意味着我无法使用通过ActiveRecord基础连接的技巧。我需要连接的数据库在设计时是未知的(即:我不能将它们的详细信息放在database.yaml中)。相反,我有一个模型“database_details”,用户将使用它来输入应用程序将在运行时执行查询的数据库的详细信息。因此与这些数据库的连接实际上是动态的,细节仅在运行时解析。 最佳答案
我有一个文件,每一行都有数字:010110101311010113114311010431420我想要一个包含每个数字出现次数的散列,在这种情况下:{0101=>2,1010=>2,1311=>2,431=>2,420=>1}我该怎么做? 最佳答案 简单的一行代码,给定一个数组items:items.inject(Hash.new(0)){|hash,item|hash[item]+=1;hash}工作原理:Hash.new(0)创建一个新的Hash,其中访问未定义的键返回0。inject(foo)使用给定的block遍历数组。对于