У меня есть пакет, на который я ссылаюсь в моем 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