golang怎么像java一样读取jar包里面的文件

nullbull · 2021-05-27 19:46:28 · 3967 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2021-05-27 19:46:28 的主题,其中的信息可能已经有所发展或是发生改变。

需求: 开发了一个module包A,里面有个文本文件 A有个初始化方法会读取这个文本文件,我在项目B里调用A的初始化方法,如果项目B里 没有同名的文本文件就会报错。 请问怎么才能让B项目中引用的A包读取A包自己的文件?


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3967 次点击  
加入收藏 微博
12 回复  |  直到 2021-06-21 14:26:55
jarlyyn
jarlyyn · #1 · 4年之前

看看go 1.16 新加的fs / go:embed能不能解决吧。

nullbull
nullbull · #2 · 4年之前
jarlyynjarlyyn #1 回复

看看go 1.16 新加的fs / go:embed能不能解决吧。

这个好像可以,但是我们项目还没用1.16

lysShub
lysShub · #3 · 4年之前

把代码贴出来看看A初始化时是怎么读取文件的?现在没有嵌入的事把?

jarlyyn
jarlyyn · #4 · 4年之前
lysShublysShub #3 回复

把代码贴出来看看A初始化时是怎么读取文件的?现在没有嵌入的事把?

有的。

他的问题是这样的

他引了个a

a除了代码,还有资源(txt)文件

直接打包的话,资源是没法打到程序里面去的。

nullbull
nullbull · #5 · 4年之前
lysShublysShub #3 回复

把代码贴出来看看A初始化时是怎么读取文件的?现在没有嵌入的事把?

func LoadFromFile(path string ) {
    if len(path) == 0 {
        path = DEFAULT_REPORTKEY_FILE_PAHT
    }
    file, err := os.OpenFile(path, syscall.O_RDONLY, 0600)
    if err != nil {
        return
    }
    all, err := ioutil.ReadAll(file)
    if nil != err {
        return
    }
    putMap(string(all))
}

根据传入的一个txt文件路径加载到map中,在项目B中引入A包,只有B中有这个txt文件才能正常加载,否则就报错了,文件不存在

nullbull
nullbull · #6 · 4年之前
jarlyynjarlyyn #4 回复

#3楼 @lysShub 有的。 他的问题是这样的 他引了个a a除了代码,还有资源(txt)文件 直接打包的话,资源是没法打到程序里面去的。

A包里还是有txt文件的,但是项目B引用不到这个文件

zzustu
zzustu · #7 · 4年之前

也不是很明白你表达的意思,怎么才能让B项目中引用的A包读取A包自己的文件? 这句话还是没读懂,程序在运行时没有所谓的 module A module B概念, 倒是有共享变量 私有变量

__Golang__
__Golang__ · #8 · 4年之前

低版本可以用"github.com/gobuffalo/packr"打包静态资源

package A

import (
    "github.com/gobuffalo/packr"
)

func LoadFromFile(path string) {
    //假设 A目录下资源位置./resource/test.txt
    box:=packr.NewBox("./resource")
    //写到这就可在终端中执行 packr 生成 a_A-packr.go
    //后面可以通过box读取资源
    content,_:=box.Find("test.txt")
    println(string(content))
}

B模块下调用

package main

import (
    "A"
)
func main(){
    A.LoadFromFile("")
}
nullbull
nullbull · #9 · 4年之前
zzustuzzustu #7 回复

也不是很明白你表达的意思,`怎么才能让B项目中引用的A包读取A包自己的文件?` 这句话还是没读懂,程序在运行时没有所谓的 module A module B概念, 倒是有共享变量 私有变量

不知道你知不知道java的jar包,相当于A包里有一个文件,B项目里引用A,但是A自己读取不了自己包里的文件

nullbull
nullbull · #10 · 4年之前
__Golang____Golang__ #8 回复

低版本可以用"github.com/gobuffalo/packr"打包静态资源 ``` package A import ( "github.com/gobuffalo/packr" ) func LoadFromFile(path string) { //假设 A目录下资源位置./resource/test.txt box:=packr.NewBox("./resource") //写到这就可在终端中执行 packr 生成 a_A-packr.go //后面可以通过box读取资源 content,_:=box.Find("test.txt") println(string(content)) } ``` B模块下调用 ``` package main import ( "A" ) func main(){ A.LoadFromFile("") } ```

目前也是类似这样生成一个.go文件,通过读取里面的字符串的方式

lysShub
lysShub · #11 · 4年之前
nullbullnullbull #5 回复

#3楼 @lysShub ``` func LoadFromFile(path string ) { if len(path) == 0 { path = DEFAULT_REPORTKEY_FILE_PAHT } file, err := os.OpenFile(path, syscall.O_RDONLY, 0600) if err != nil { return } all, err := ioutil.ReadAll(file) if nil != err { return } putMap(string(all)) } ``` 根据传入的一个txt文件路径加载到map中,在项目B中引入A包,只有B中有这个txt文件才能正常加载,否则就报错了,文件不存在

你现在这只是路径的问题,用绝对路径就绝对没问题了。

nullbull
nullbull · #12 · 4年之前

@lysShub 我查了很多,没有找到获取这个路径的方法,如果您知道,请指教;

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传