2017-11-28 1 views
0

저는 Go 전문가가 아니므로 이동을위한 이상적인 방법이 아닙니다. 본질적으로, 나는 그것을 위해 작성된 플러그인을 가질 수 있어야하는 메인 애플리케이션을 가지고있다. 플러그인은 모두 주어진 형식을 따르며 go build -buildmode=plugin으로 빌드됩니다. 최종 사용자가 매번 주 응용 프로그램을 다시 컴파일해야하는 것은 원하지 않습니다. 이상없이 새 컴퓨터에 문제없이 드래그 앤 드롭 할 수 있어야합니다.플러그인과 기본 응용 프로그램 간의 Golang 패키지 버전

플러그인과 응용 프로그램간에 정보를 전달하기 위해 C 헤더 파일과 비슷한 것으로 "공통"이라는 세 번째 패키지가 정의되어 있습니다. 이 인터페이스는 둘 다 사용할 수있는 인터페이스와 정수 상수 만 정의합니다. 응용 프로그램은 인터페이스를 준수하는 유형을 생성하고이를 플러그인에 전달하여 사용할 수 있습니다.

컴파일 할 때 제대로 작동하는 것으로 보이며 응용 프로그램에 plugin.Open을 사용하여 플러그인을로드 할 수 있습니다. 캐치는 common 패키지의 위치를 ​​이동하려고 할 때 발생합니다. 로컬 디렉토리에 원본 응용 프로그램을 빌드하고 응용 프로그램을 설치하는 스크립트가 있고 common 패키지가 GOPATH에 복사되므로 찾을 수 있습니다. 자, 플러그인을 작성하고 common 패키지의 전역 사본을 참조하여 컴파일하려고 할 때 패키지의 두 번 발생을 다른 버전으로보고 있기 때문에 기본 애플리케이션에서 플러그인을로드 할 수 없습니다.

필자가 알고있는 점은 패키지 버전을 결정할 때 컴파일 타임에 패키지의 모든 Go 파일을 해시하는 것입니다. 패키지가 발견 된 서버의 위치를 ​​포함하여이 해시가 있습니까?

패키지의 실제 버전이 동일하다는 사실을 알고 있습니다. 유일한 차이점은 내가 cp -r src/myapp /usr/local/go/src입니다. 이 방법을 사용하면 사용자가 주 응용 프로그램을 다른 컴퓨터로 옮길 수 있고 다시 컴파일 할 필요가없는 접근 방식보다 더 좋은 방법이 있습니까?

또한 설명 : 나는 myapp에이 컴파일되면

가 여기 내 디렉토리 구조

./ 
    |-- main.go 
    |-- src/myapp/common 
    |  |-- Common.go 
    |-- install.sh 

이다, 나는 GOPATHsrc/myapp/common을 복사 한 다음 해당 패키지에 대한 go build -buildmode=plugin와 플러그인을 구축 할 수 있습니다. myapp에서 해당 플러그인을로드 할 때 myapp/common의 두 버전은 서버의 위치 만 다르지만 차이가 있다고 봅니다.

답변

1

대신 공용 패키지의 경로를 안정적으로 유지하려고 했습니까? 당신은 아마도 그것 자신의 repo에 (두 프로젝트가 그것을 참조 할 수 있도록), 또는 귀하의 응용 프로그램 저장소에 그것을 유지하지만 플러그인이 거기에 연결할 수 있도록해야합니다.

github.com/ : 당신은 (모두 응용 프로그램 및 플러그인에 대한) 가져 오기 경로를 만들 수

github.com/brianwest/myapp

: 그래서 예를 들면

는 프로젝트에 살고 말 brianwest/myapp/src/common

또는

github.co.kr/brianwest/common

앱 및 플러그인 전체에서 안정적으로 유지하십시오. 그러면 스크립트가 gopath에 복사 할 필요가 없으며 src/github에 복사 할 수 있습니다. .com/brianwest/common을 사용하고 플러그인과 앱에서이 경로를 사용하십시오.

+0

올바른 방법은 공통 패키지를 별도의 프로젝트로 분리 한 다음 두 프로젝트 모두에서 독립 프로젝트를 참조하게하는 것입니다. 그건 의미가 있습니다. 나중에 새 컴퓨터로 이동하면 원래 컴퓨터에서 컴파일되는 기본 응용 프로그램과 올바르게 작동합니까? –

+0

네, 일반적인 패키지를 안정적인 가져 오기 URL로 유지하는 것이 좋습니다. go는 다른 패키지로 다른 URL을 보게됩니다. 그래서 그것을 고치면 잘 작동합니다. 별도의 프로젝트라면 플러그인이나 그와 비슷한 것으로 부를 수 있으며 플러그인을 작성하는 방법을 설명하는 readme와 함께 플러그인의 기능을 지원하게 만들 수 있습니다. –

+0

Gotcha! 나는 그것을 시도하고 내 문제를 해결하는 것으로 보인다. 매우 감사. –

관련 문제