草庐IT

Golang——资源应该放在哪里

coder 2023-07-01 原文

很长一段时间以来,我一直在想我的 go 包的资源在哪里保存,但我找不到正确的答案。

现在,资源保存在

  • 主要/模块1/资源
  • 主要/模块2/资源

当我从 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/

有关Golang——资源应该放在哪里的更多相关文章

  1. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  2. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  3. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  4. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  5. ruby-on-rails - 带有 Zeus 的 RSpec 3.1,我应该在 spec_helper 中要求 'rspec/rails' 吗? - 2

    使用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中做

  6. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用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

  7. ruby - Chef LW 资源属性默认值如何引用另一个属性? - 2

    我正在尝试将一个资源属性的默认值设置为另一个属性的值。我正在为我正在构建的tomcat说明书定义一个资源,其中包含以下定义。我想要可以独立设置的“名称”和“服务名称”属性。当未设置服务名称时,我希望它默认为为“名称”提供的任何内容。以下不符合我的预期:attribute:name,:kind_of=>String,:required=>true,:name_attribute=>trueattribute:service_name,:kind_of=>String,:default=>:name注意第二行末尾的“:default=>:name”。当我在Recipe的新block中引用我

  8. ruby-on-rails - ActiveRecord::Associations::CollectionProxy 从哪里获取.each 实例方法? - 2

    假设我有模型Topics和Posts,其中Topichas_many:posts和Postbelongs_to:topic。此时我的数据库中已经有了一些东西。如果我进入Rails控制台并输入Topic.find(1).posts我相信我得到了一个CollectionProxy对象。=>#]>我可以对此调用.each以获得枚举器对象。=>#]:each>我对CollectionProxy如何处理.each感到困惑。我意识到它在某些时候是继承的,但我一直在阅读API文档,他们并没有说得很清楚CollectionProxy是从什么继承的,除非我遗漏了一些明显的东西。Thispage似乎并没有

  9. ruby-on-rails - 闪存消息存储在哪里? - 2

    我以为它们存储在cookie中-但不,检查cookie没有任何结果。session也不存储它们。那么,我在哪里可以找到它们?我需要这个来直接设置它们(而不是通过flashhash)。 最佳答案 它们存储在inyoursessionstore.自rails2.0以来的默认设置是cookie存储,但请检查config/initializers/session_store.rb以检查您是否使用默认设置以外的东西。 关于ruby-on-rails-闪存消息存储在哪里?,我们在StackOverf

  10. ruby-on-rails - 我现在(2010 年 1 月)应该使用哪个版本的 Ruby? - 2

    我有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

随机推荐