Как установить пакет Golang локально, на который ссылается адрес github.com - PullRequest
0 голосов
/ 23 января 2020

У меня есть пакет, на который я ссылаюсь в моем Go коде:

github.com/apache/pulsar/pulsar-function-go/pf

Однако мне нужно включить некоторые локальные изменения в эту библиотеку при построении docker изображение для настройки интеграционного теста.

В моем Dockerfile я настроил GOPATH и GOROOT и PATH следующим образом:

ENV GOROOT /usr/local/go
ENV GOPATH /go
ENV PATH /go/bin:$PATH

Затем, в Dockerfile, я копирую исходный код в свой Docker образ и попытка установить модуль Go, например:

COPY target/pulsar-function-go/ /pulsar/dependencies/pulsar-function-go/
RUN cd /pulsar/dependencies/pulsar-function-go/pf && go install .

Однако, когда я тогда пытаюсь создать файл, который ссылается на github.com/apache/pulsar/pulsar-function-go/pf, запустив эту строку:

RUN go build -o /pulsar/examples/go-examples/exclamationFunc /pulsar/examples/go-examples/exclamationFunc.go

Я получаю это сообщение об исключении:

---> Запуск в bb3ec43f7fea examples / go -examples / exclamationFun c. go: 24 : 2: не удается найти пакет «github.com/apache/pulsar/pulsar-function-go/pf» ни в одном из: /usr/local/go/src/github.com/apache/pulsar/pulsar-function-go/ pf (от $ GOROOT) /go/src/github.com/apache/pulsar/pulsar-function-go/pf (от $ GOPATH)

Есть ли способ позвольте мне использовать локально установленную версию того же пакета без необходимости изменять ссылку в коде, который я пытаюсь создать?

РЕДАКТИРОВАТЬ Вот все остальное, что я пробовал:

Когда я запускаю go install в pulsar-function- go, я получаю:

cannot find module for path .

Когда я запускаю go install в pulsar-function-go / pf, я получаю:

examples/go-examples/exclamationFunc.go:24:2: cannot find package "github.com/apache/pulsar/pulsar-function-go/pf" in any of:
        /usr/local/go/src/github.com/apache/pulsar/pulsar-function-go/pf (from $GOROOT)
        /go/src/github.com/apache/pulsar/pulsar-function-go/pf (from $GOPATH)

При попытке запустить:

RUN go get -t github.com/apache/pulsar/pulsar-function-go/...

(хотя это не будет вносить мои локальные изменения, это было только для тестирования) Я получаю:

# github.com/apache/pulsar/pulsar-function-go/examples/test
/go/src/github.com/apache/pulsar/pulsar-function-go/examples/test/producer.go:30:6: main redeclared in this block
        previous declaration at /go/src/github.com/apache/pulsar/pulsar-function-go/examples/test/consumer.go:30:6
# github.com/apache/pulsar/pulsar-function-go/examples
/go/src/github.com/apache/pulsar/pulsar-function-go/examples/hello.go:32:6: main redeclared in this block
        previous declaration at /go/src/github.com/apache/pulsar/pulsar-function-go/examples/contextFunc.go:36:6
/go/src/github.com/apache/pulsar/pulsar-function-go/examples/inputFunc.go:34:6: main redeclared in this block
        previous declaration at /go/src/github.com/apache/pulsar/pulsar-function-go/examples/hello.go:32:6
/go/src/github.com/apache/pulsar/pulsar-function-go/examples/outputFunc.go:33:6: main redeclared in this block
        previous declaration at /go/src/github.com/apache/pulsar/pulsar-function-go/examples/inputFunc.go:34:6

Когда я пытаюсь запустить:

RUN go get -t github.com/apache/pulsar/pulsar-function-go

Я получаю:

package github.com/apache/pulsar/pulsar-function-go: no Go files in /go/src/github.com/apache/pulsar/pulsar-function-go

Если я попытаюсь запустить это, чтобы сначала получить некоторые зависимости:

RUN go get -t github.com/apache/pulsar/pulsar-function-go/pf

, это будет успешно. Если затем я следую этому в моем Dockerfile с помощью:

# after using Maven plugin to copy files from the pulsar-function-go source directory to target/pulsar-function-go
COPY target/pulsar-function-go/ /go/src/github.com/apache/pulsar/pulsar-function-go
RUN cd /go/src/github.com/apache/pulsar/pulsar-function-go/pf && go install

, чтобы заменить исходный код функции pulsar-function- go в файле docker на мой локальный код, то при попытке собрать бинарный, как это:

RUN go build -o /pulsar/examples/go-examples/exclamationFunc /pulsar/examples/go-examples/exclamationFunc.go

Я получаю:

/go/src/github.com/apache/pulsar/pulsar-function-go/pb/InstanceCommunication.pb.go:29:2: cannot find package "google.golang.org/grpc" in any of:
        /usr/local/go/src/google.golang.org/grpc (from $GOROOT)
        /go/src/google.golang.org/grpc (from $GOPATH)
/go/src/github.com/apache/pulsar/pulsar-function-go/pb/InstanceCommunication.pb.go:30:2: cannot find package "google.golang.org/grpc/codes" in any of:
        /usr/local/go/src/google.golang.org/grpc/codes (from $GOROOT)
        /go/src/google.golang.org/grpc/codes (from $GOPATH)
/go/src/github.com/apache/pulsar/pulsar-function-go/pb/InstanceCommunication.pb.go:31:2: cannot find package "google.golang.org/grpc/status" in any of:
        /usr/local/go/src/google.golang.org/grpc/status (from $GOROOT)
        /go/src/google.golang.org/grpc/status (from $GOPATH)
12:13

Пакет Google. golang .org / grp c включен в файл go.mod, который выглядит так:

module github.com/apache/pulsar/pulsar-function-go
go 1.13
require (
    github.com/apache/pulsar-client-go v0.0.0-20200116214305-4d788d9935ed
    github.com/golang/protobuf v1.3.2
    github.com/sirupsen/logrus v1.4.1
    github.com/stretchr/testify v1.3.0
    golang.org/x/tools v0.0.0-20200119215504-eb0d8dd85bcc // indirect
    google.golang.org/grpc v1.26.0
    gopkg.in/yaml.v2 v2.2.2
)

Из приведенного ниже ответа мне сказали, что я могу вставить директиву replace в модуль Go, чтобы мы могли указывать на локальные файлы при сборке Go двоичные файлы для тестов. Тем не менее, я не думаю, что смог установить модуль правильно, возможно, из-за того, что pulsar-function-go / examples включены в модуль. Итак, я не могу понять, что нужно установить как /local/path/to/package, потому что я не могу установить пакет успешно. (Может быть, я тоже запутался в этом?)

Есть ли лучший способ, которым мы могли бы структурировать модуль / код, чтобы разрешить установку локального модуля pulsar-function- go в тестовый Docker image?

Если вы хотите посмотреть код Go самостоятельно, посмотрите его здесь: https://github.com/apache/pulsar/tree/master/pulsar-function-go Dockerfile здесь: https://github.com/apache/pulsar/blob/master/tests/docker-images/latest-version-image/Dockerfile

1 Ответ

3 голосов
/ 23 января 2020

Используйте go модули для вашего проекта и включите в него директиву replace для пакета, на который вы ссылаетесь:

replace github.com/apache/pulsar/pulsar-function-go/pf => /local/path/to/package
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...