2016-10-09 11 views
9

私は既存のApp Engineプロジェクトに「vend vendoring」(vendorという名前のフォルダに依存関係を格納する)を導入しようとしています。Google App Engineを使用したベンダー作業を行うにはどうすればよいですか?

go-app-builder: Failed parsing input: package "golang.org/x/net/context" is imported from multiple locations: "/Users/erik/go/src/github.com/xyz/abc/vendor/golang.org/x/net/context" and "/Users/erik/go/src/golang.org/x/net/context"

私は2つの場所がに解決すべきであると考えている:私は(ヘルパーとしてGodepを使用して)、ベンダフォルダ内のすべての依存関係を格納している、それが右に見えますが、私は次のエラーを取得するアプリケーションをローカルで実行していますGoアプリケーションは最初にvendorフォルダ内を検索する必要があります。両方の依存関係が同じであることをAppengineに理解させる方法はありますか?

+0

これまで私はこの問題を見てきましたが、通常はビルドしていたリポジトリのすべてのベンダーディレクトリが適切に設定されていることを確認して解決しました。このエラーが発生するコマンドは何ですか? – Aaron

+0

エラーはdev_appserver.pyからのものです。ベンダーのディレクトリが正しく設定されていないと仮定するのは合理的ですが、手がかりはありますか?それは私には大丈夫だと私たちのunittestsは問題なく実行されます。 – emidander

+0

私が理解しているように、 'go-app-builder'ツールはApp Engine固有のビルドを容易にするために、標準goツールと少し違って動作するので、動作に不一致があるのか​​もしれません。使用しているSDKのバージョンは何ですか? – Aaron

答えて

2

私はGodepsの代わりにgovendorを使用してこのエラーを解決することができました。根本的な原因は、彼らが独自に販売している参考文献の参照がGodepsによって正しく解決されていなかったことです。

Su-Au Hwangの回答も正しいです。あなたはapp.yamlをあなたのソースとは別にしておかなければなりません。

1

私は実際に自分自身でこの問題に直面しました。この問題は、App Engineツールを使用して、ベンダーを使用しているものをインポートするパッケージをビルドするときに発生しますが、実行しようとしているパッケージにはそのベンダーのディレクトリ内にインポートがありません。

ので、例えば、私はパッケージbarをインポートパッケージfooを実行しようとしている、とbarリポジトリはゴリラ/マルチプレクサが含まれているvendor/ディレクトリを持っている場合はその両方が、github.com/gorilla/muxライブラリを使用していますが、場合fooパッケージにはvendor/ディレクトリにゴリラmuxがありません。このエラーが発生します。

これが起こる理由は、barパッケージは、パッケージvendorfooインポートパスの実際の位置の差を引き起こし、使用するものであるGOPATH内の1つ、の上に自分の優先順位だということです。

私がこの問題に遭遇した解決策は、fooディレクトリがGOPATHにあり、ベンダーディレクトリが正しくインストールされていることを確認することです。 vendor/の規約はGOPATHの中でのみ動作することに注意することが重要です。

7

あなたのプロジェクトディレクトリ(app.yaml)はおそらくGOPATH/srcにあります。 これではいけません。 go-app-builderはapp.yamlフォルダー内(およびそれ以下)のすべてを取得し、さらにGOPATHをその中にマージします。

解決策は、app.yamlをGOPATH/srcフォルダから移動することです。 さらに、goapp testは、依存関係の解決に関しては、goapp servegoapp deployとは異なる動作をすることがわかります。

これは私が使用している解決策です(すでにgolangアプリケーションエンジンを使用していない)。これはgoappコマンドとgovendorが正しく動作することがわかった唯一の設定ですないように注意してください)godepについて

/GOPATH 
├──/appengine 
| ├── app.yaml 
| └── aeloader.go 
└──/src 
    └── /MYPROJECT 
     ├── main.go 
     ├── /handler 
     | └── handler.go 
     └── /vendor 

詳細:

file: GOPATH/appengine/aeloader.go (NOTE the init function is necessary, probably a bug though) 
package mypackage 

import (
    _ "MYPROJECT" 
) 

func init() { 
} 

は今01から../GOPATH/appengine/goapp test ./...からgoapp servegoapp deployを実行します

P.私はグローバルなGOPATHのことをばかげて見つけて、単に私のGOPATHを現在のプロジェクトフォルダ(上記の例では/GOPATH)に設定し、すべてをバージョンコントロールにチェックインします。

+0

これは狂気です。今はGOPATHの外で生きる必要がありますか?それはビルドの特質をどこで終わらせますか?ありがとう、結構です。真剣に。 – hraban

+0

良い答え。私はこのアプローチをテストするためにGitHubで簡単なアプリケーションを作成しました。それは動作します:https://github.com/nikolay-turpitko/x-gae-dep –

1

同じ問題が発生しました。

For best results, we recommend the following:

  • Create a separate directory in your app's directory for each service.
  • Each service's directory should contain the service's app.yaml file and one or more .go files.
  • Do not include any subdirectories in a service's directory.
  • Your GOPATH should specify a directory that is outside your app's directory and contain all the dependencies that your app imports.

しかし、これは次のようになります私のプロジェクト構造、台無し:myprojectディレクトリをgitのプロジェクトであるとvendorフォルダがすべて含まれてい

GOPATH/ 
└── src 
    └── github.com 
     └── username 
      └── myproject 
       ├── app.yaml 
       ├── cmd 
       │   └── myproject 
       │    └── main.go 
       ├── handlers 
       │   └── api.go 
       ├── mw 
       │   ├── auth.go 
       │   └── logger.go 
       └── vendor 

docs Googleは、以下のことを示唆しているで 依存関係。まず、main.goファイルが(同じドキュメントからの)同じディレクトリおよび第二ではないので はapp.yamlファイルの命が動作しないmyprojectディレクトリからgcloud deployを実行:

you must be careful not to place your source code at or below your app's directory where the app.yaml file is located

私を構築している私は何をやってしまいました代わりに独自のカスタムランタイムを使用していましたが、これは非常にきれいな解決策でした。
は、単に次のコマンドでDockerfileを生成:

gcloud beta app gen-config --custom 

をごapp.yamlruntime: customを指定し、通常は展開した後、それを変更します。
ここでのトリックはもちろん、どこにコピーされるのかを制御していることです。ここで
は私Dockerfileです:

# Dockerfile extending the generic Go image with application files for a 
# single application. 
FROM gcr.io/google-appengine/golang 

ENV GOPATH /go 

# The files which are copied are specified in the .dockerignore file 
COPY . /go/src/github.com/username/myproject/ 

WORKDIR /go/src/github.com/username/myproject/ 

RUN go build -o dist/bin/myproject ./cmd/myproject 

# All configuration parameters are passed through environment variables and specified in app.yaml 
CMD ["/go/src/github.com/username/myproject/dist/bin/myproject"] 

App Engineは、アプリケーションがより多くの詳細については、Building Custom Runtimesドキュメントをチェックアウトポート8080でリッスンして期待していることを忘れないでください。

0

回避策として、単純なbashスクリプトまたはMakefileを使用します。

TMPGOPATH := $(shell mktemp -d) 

deploy: 
    cp -r vendor/ $(TMPGOPATH)/src 
    GOPATH=$(TMPGOPATH) gcloud app deploy 
    rm -fr $(TMPGOPATH) 

私はvendor/ディレクトリの近くに私のサービスのルートでこのMakefileを保存し、単に手動またはCIから展開するmake deployを使用しています。

Glide、Godeps、Goベンダー仕様を尊重するツールで動作します。

関連する問題