Belgikoi
Belgikoi

Reputation: 615

App Engine deploy with Go libraries

I'm new on Google App Engine. And, I'm getting an issue that I can't solve.

I've a very simple app (developped in Go) like this :

main/
|   model/
|   |   user.go
|   main.go
|   app.yaml

These are the imports of main.go :

import (
    "github.com/julienschmidt/httprouter"
    "log"
    "net/http"
)

My code works well when I run it locally.

But, when I try to publish it on my Google App Engine instance, I receive this error :

$ gcloud app deploy

You are about to deploy the following services:
 - <MY_APP_ENGINE_URL> (from [<MY_LOCAL_YAML_PATH>])
 Deploying to URL: [<MY_APP_ENGINE_URL>]

Do you want to continue (Y/n)?  Y

Beginning deployment of service [default]...
Some files were skipped. Pass `--verbosity=info` to see which ones.
You may also view the gcloud log file, found at
[<LOCAL_APP_ENGINE_LOG>].
File upload done.
Updating service [default]...failed.                                                                                                                                                             
ERROR: (gcloud.app.deploy) Error Response: [9] Deployment contains files that cannot be compiled: Compile failed:
2017/05/27 14:48:24 go-app-builder: build timing: 5×compile (301ms total), 0×link (0s total)
2017/05/27 14:48:24 go-app-builder: failed running compile: exit status 2

main.go:4: can't find import: "github.com/julienschmidt/httprouter"

What did I do wrong ?

EDIT : This is the content of my app.yaml file :

runtime: go
api_version: go1

handlers:
- url: /.*
  script: _go_app

Upvotes: 0

Views: 332

Answers (2)

ain
ain

Reputation: 22749

I haven't used the gcloud tool, but back in the day when goapp was the tool you had to create github.com/julienschmidt/httprouter (with the lib's source in it, of course) directly under you'r main and then deploy.

AFAIK the App Engine's go version is currently 1.6 which means that while the vendoring is on by default, it can be switched off - perhaps thats the case and thats why @Yandry Pozo's suggestion doesn't work.

Upvotes: 0

Yandry Pozo
Yandry Pozo

Reputation: 5123

App Engine environment doesn't contain your dependencies, you can add an script to do a go get ... for each one but it's too hacky and Go has a solution for that, we can save our dependencies in a vendor folder on the root of our project.

Quick solution:

# Instal godep:
go get -v -u github.com/tools/godep

cd your/project/path
godep save

Now try to deploy again, you'll see a vendor folder in your project, don't remove it and add it to your git source, that folder contains all your third party dependencies like your httprouter (it's my favorite :) )

Note You can use other tools to save your dependencies

Upvotes: 1

Related Questions