【问题标题】:Is it possible to present an embedded file as a filename?是否可以将嵌入文件显示为文件名?
【发布时间】:2021-08-18 12:36:11
【问题描述】:

我使用需要文件名作为参数的functionstring 类型)。提供文件名时效果很好。

我想在我的二进制文件中使用embed this file。然后我可以将内容设置为[]bytestring,但这没有用。我也可以将其命名为embed.FS,但我的理解是这是一个只能由某些函数使用的抽象。

我需要的是能够将此嵌入文件显示为文件名string),然后底层函数将使用它来打开(嵌入)文件。 p>

这可能吗?

【问题讨论】:

  • @colm.anseo:是的,我的问题是关于如何直接访问这些嵌入文件的文件名(这显然是不可能的)
  • 如果嵌入文件的真实路径在运行时可以依赖,则不需要嵌入。
  • @HymnsForDisco:是的,有:将文件包含在二进制文件中。
  • 我的意思是嵌入文件的目的是,一旦部署,您不一定要依赖该文件存在于本地文件系统中。在这种情况下,如果嵌入的文件不是真的有用,则获取文件路径,因为我们已经说过,您不能依赖那里的文件。如果您的问题似乎来自糟糕的库设计,则根源在于它迫使您传递磁盘上文件的路径。如果你想使用一些内存数据而不是文件,你可以写入一个临时文件,然后传递它的路径。

标签: go embed filenames


【解决方案1】:

Key 接受作为字符串参数的文件名只是ioutil.ReadFile 上的抽象,参见auth.go

你可以自己实现 ssh.Auth,这里是一个小例子。

package main

import (
    _ "embed"
    "fmt"

    "github.com/melbahja/goph"
    "golang.org/x/crypto/ssh"
)

//go:embed id_rsa
var privateKey []byte

func main() {
    auth, err := Auth(privateKey, []byte("foobar"))

    fmt.Println(auth, err)
}

func Auth(privateKey, pass []byte) (goph.Auth, error) {
    signer, err := Singer(privateKey, pass)
    if err != nil {
        return nil, err
    }

    return goph.Auth{
        ssh.PublicKeys(signer),
    }, nil
}

func Singer(privateKey, pass []byte) (ssh.Signer, error) {
    if len(pass) != 0 {
        return ssh.ParsePrivateKeyWithPassphrase(privateKey, pass)
    }
    return ssh.ParsePrivateKey(privateKey)
}

【讨论】:

  • 感谢完整答案和重写 - 但我也会对一般答案感兴趣(对于其他情况)
  • 简短回答 - 不,这是不可能的。您在磁盘上传递privatekey 文件的位置,ioutil.Readfile 读取它。您不能将fs 传递到此过程中,因此您可以从嵌入的 fs 中读取。
猜你喜欢
  • 2011-09-05
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 2020-01-27
  • 2011-05-29
相关资源
最近更新 更多