很长一段时间以来,我一直在想我的 go 包的资源在哪里保存,但我找不到正确的答案。
现在,资源保存在
当我从 main 使用 go run *.go 时,它工作正常。但是,当我运行测试时,找不到资源,因为 Go 将当前工作目录更改为相应的模块。一种解决方法是只使用 os.Chdir('..') 但对每个测试都这样做似乎有点烦人。此外,有时资源会在包初始化时加载。这意味着有一个包含所有模板(及其相应名称)的全局映射:
package module2
var myTemplates = map[string]template { "index": loadTemplateFromFile() }
我知道你不应该因为并发而在 go 中使用全局变量,但这个变量对于并发读取是安全的(并且它只在启动期间写入)。所以我将模板放入一个全局变量中,以便它们可以在启动时加载,并且在启动期间捕获一些错误并且模板已经在内存中。
这意味着我无法及时更改工作目录,因为问题已经崩溃并出现错误告诉我找不到文件(这正是我想要的行为)。
后来,我发现了一个方法runtime.Caller来获取go文件编译的路径(如果有的话):
base := "."
if _, filename, _, ok := runtime.Caller(0); ok {
base = path.Join(path.Dir(filename), "..")
}
file := path.Join(base, "module1", "resources", ...)
现在,所有测试工作正常,go run *.go 也找到了正确的资源。一旦我开始部署我的包,这种方法就会成为一个问题。因为 runtime.Caller 使用编译期间使用的路径,所以我必须将资源放在我编译它们的位置。这意味着当我在 /home/matt3o12/go/src/domain.tld/matt3o12/mypackage 中构建二进制文件时,我必须将所有资源文件夹放在服务器上完全相同的路径中。
我也尝试过使用 os.Executable 但这毫无意义,因为它只是指向一些临时路径,其中包含已编译的可执行文件(没有资源)。除非我编译一个测试包并手动运行它,但这是非常繁重的工作。
我也不打算将资源存储在二进制文件中(拥有项目资源的文件夹结构就可以了)。
我确实有一些解决这个问题的想法,但我认为没有任何想法是可选的:
go test ./... 或 go run *.go 时,我必须担心正确的资源路径)。这不是的副本:
最佳答案
没有“应该”。你可以把它们放在你认为合适的地方。如果需要,您可以嵌入它们。最简单的方法可能是使用一些合理的默认值(例如默认为“.”或 runtime.Caller(0))来配置您的资源路径。
关于Golang——资源应该放在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44915103/
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
使用rspec-rails3.0+,测试设置分为spec_helper和rails_helper我注意到生成的spec_helper不需要'rspec/rails'。这会导致zeus崩溃:spec_helper.rb:5:in`':undefinedmethod`configure'forRSpec:Module(NoMethodError)对thisissue最常见的回应是需要'rspec/rails'。但这是否会破坏仅使用spec_helper拆分rails规范和PORO规范的全部目的?或者这无关紧要,因为Zeus无论如何都会预加载Rails?我应该在我的spec_helper中做
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我正在尝试将一个资源属性的默认值设置为另一个属性的值。我正在为我正在构建的tomcat说明书定义一个资源,其中包含以下定义。我想要可以独立设置的“名称”和“服务名称”属性。当未设置服务名称时,我希望它默认为为“名称”提供的任何内容。以下不符合我的预期:attribute:name,:kind_of=>String,:required=>true,:name_attribute=>trueattribute:service_name,:kind_of=>String,:default=>:name注意第二行末尾的“:default=>:name”。当我在Recipe的新block中引用我
假设我有模型Topics和Posts,其中Topichas_many:posts和Postbelongs_to:topic。此时我的数据库中已经有了一些东西。如果我进入Rails控制台并输入Topic.find(1).posts我相信我得到了一个CollectionProxy对象。=>#]>我可以对此调用.each以获得枚举器对象。=>#]:each>我对CollectionProxy如何处理.each感到困惑。我意识到它在某些时候是继承的,但我一直在阅读API文档,他们并没有说得很清楚CollectionProxy是从什么继承的,除非我遗漏了一些明显的东西。Thispage似乎并没有
我以为它们存储在cookie中-但不,检查cookie没有任何结果。session也不存储它们。那么,我在哪里可以找到它们?我需要这个来直接设置它们(而不是通过flashhash)。 最佳答案 它们存储在inyoursessionstore.自rails2.0以来的默认设置是cookie存储,但请检查config/initializers/session_store.rb以检查您是否使用默认设置以外的东西。 关于ruby-on-rails-闪存消息存储在哪里?,我们在StackOverf
我有1.8.6附带的VanillaMacOSXLeopard。我是RoR的新手,所以会学习网上的教程。在使用更高版本的Ruby时,我是否可能会发现遵循它们的问题?我目前正在查看提到1.8.6和1.8.7的这个-http://www.railstutorial.org/book 最佳答案 RoR教程对两者都适用,但如果您正在学习Ruby,则应该学习1.9。Rails3将不支持1.8.6,所以我会选择1.8.7或1.9。我还推荐使用RVM在Ruby版本之间切换。 关于ruby-on-rail