programing

내 GOPATH와 관련된 파일을 어떻게 열 수 있습니까?

nasanasas 2020. 11. 24. 08:04
반응형

내 GOPATH와 관련된 파일을 어떻게 열 수 있습니까?


io/ioutil작은 텍스트 파일을 읽는 데 사용 하고 있습니다.

fileBytes, err := ioutil.ReadFile("/absolute/path/to/file.txt")

그리고 그것은 잘 작동하지만 이것은 정확하게 이식 할 수 없습니다. 제 경우에는 열고 싶은 파일이 GOPATH에 있습니다. 예를 들면 다음과 같습니다.

/Users/matt/Dev/go/src/github.com/mholt/mypackage/data/file.txt

data폴더가 소스 코드 바로 옆에 있기 때문에 상대 경로를 지정하고 싶습니다.

data/file.txt

하지만 다음 오류가 발생합니다.

패닉 : data / file.txt 열기 : 해당 파일 또는 디렉토리 없음

상대 경로를 사용하여 파일을 열 수 있습니까? 특히 Go 코드와 함께있는 경우에는 어떻게해야합니까?

( 내 질문은 특히 GOPATH와 관련된 파일 열기 에 관한 것입니다. Go에서 상대 경로를 사용하여 파일을 여는 것은 절대 경로 대신 상대 경로를 제공하는 것만 큼 쉽습니다. 파일은 컴파일 된 바이너리의 작업 디렉토리를 기준으로 열립니다. 경우에, 바이너리가 컴파일 된 위치와 관련된 파일을 열고 싶습니다. 돌이켜 보면 이것은 잘못된 설계 결정입니다.)


흠 ... path/filepath패키지는 Abs()약간 불편하지만 내가 필요한 것을 (지금까지) 수행합니다.

absPath, _ := filepath.Abs("../mypackage/data/file.txt")

그런 다음 absPath파일을로드하는 데 사용 하면 제대로 작동합니다.

필자의 경우 데이터 파일은 main프로그램을 실행중인 패키지와는 별도의 패키지에 있습니다. 모두 동일한 패키지에있는 경우 선행 ../mypackage/. 이 경로는 분명히 상대적이기 때문에 프로그램마다 구조가 다르며 이에 따라 조정해야합니다.

Go 프로그램에서 외부 리소스를 사용하고 이식 가능한 상태로 유지하는 더 좋은 방법이 있다면 자유롭게 다른 답변을 제공하세요.


이것은 꽤 잘 작동하는 것 같습니다.

import "os"
import "io/ioutil"

pwd, _ := os.Getwd()
txt, _ := ioutil.ReadFile(pwd+"/path/to/file.txt")

이 문제를 정확히 해결하기 위해 gobundle작성 했습니다 . 데이터 파일에서 Go 소스 코드를 생성 한 다음 바이너리로 컴파일합니다. 그런 다음 VFS와 유사한 레이어를 통해 파일 데이터에 액세스 할 수 있습니다. 완전히 이식 가능하며 전체 파일 트리 추가, 압축 등을 지원합니다.

단점은 소스 데이터에서 Go 파일을 빌드하려면 중간 단계가 필요하다는 것입니다. 나는 보통 이것을 위해 make를 사용합니다.

다음은 번들의 모든 파일을 반복하여 바이트를 읽는 방법입니다.

for _, name := range bundle.Files() {
    r, _ := bundle.Open(name)
    b, _ := ioutil.ReadAll(r)
    fmt.Printf("file %s has length %d\n", name, len(b))
}

GeoIP 패키지 에서 실제 사용 예를 볼 수 있습니다 . Makefile코드를 생성하고, geoip.goVFS에 사용합니다.


나는 Alec Thomas가 The Answer를 제공했다고 생각하지만, 내 경험상 그것은 완벽하지 않습니다. 리소스를 바이너리로 컴파일하는 데있어 한 가지 문제는 자산의 크기에 따라 컴파일에 많은 메모리가 필요할 수 있다는 것입니다. 크기가 작 으면 걱정할 필요가 없습니다. 내 특정 시나리오에서 1MB 글꼴 파일로 인해 컴파일에 약 1GB의 메모리가 필요했습니다. Raspberry Pi에서 얻을 수 있기를 원했기 때문에 문제였습니다. 이것은 Go 1.0에서였습니다. Go 1.1에서는 상황이 개선되었을 수 있습니다.

따라서이 특별한 경우에는 go/build패키지를 사용 하여 가져 오기 경로를 기반으로 프로그램 소스 디렉토리 를 찾는 것을 선택 합니다. 물론이를 위해서는 타겟이 GOPATH설정되어 있고 소스를 사용할 수 있어야합니다. 따라서 모든 경우에 이상적인 솔루션은 아닙니다.

참고 URL : https://stackoverflow.com/questions/17071286/how-can-i-open-files-relative-to-my-gopath

반응형