# 20.3 安装 Go App Engine SDK：为 Go 部署的开发环境

## 20.3.1 安装

从下载页面下载合适你的系统的 GAE SDK 压缩文件：https://cloud.google.com/appengine/downloads

例如：你的系统是 64 位的 Linux Ubuntu 11.10 系统，则下载 go_appengine_sdk_linux_amd64-1.6.1.zip 文件。

用 Archieve Manager 打开并且提取出到你选择的一个目录下（例如你的 home 目录）：它会创造一个叫做 google_appengine 的文件，其包含了整个 AppEngine for Go 的开发环境。例如在 /home/user/google_appengine 或者 "install root"/google_appengine/goroot 目录下。

这个环境包含了您在本地开发、构建和测试您的应用程序所需的一切：它包括一个 AppEngine 服务器来测试您的应用程序，一个 DataStore，用来在这里存储数据，就像您最终在 AppEngine 服务器上托管的实时应用程序一样；以及其他 API 支持和工具，使您可以模仿真正的 AppEngine 来进行开发和测试的目的。由于这个 AppEngine 环境是针对 Go 的，它也包含了 适当的 Go 编译器、软件包和工具作为下载的一部分。

<u>GAE-Go 和普通 Go 之间的区别：</u>

GAE-Go 的运行时 (runtime) 提供完整的 Go 语言和几乎所有的标准库，除了一些在 App Engine 环境中没有意义的东西：

- 现在没有 `unsafe` 包了，并且 `syscall` 包被修剪过了。
- 它不支持 cgo（不与 C 库交互），甚至：你不能在 GAE 项目中使用任何二进制库（Go 或其他）。你需要回溯所有东西的源，直到 GAE 编译/链接到了所有的源代码。
- 不支持 go install 工具
- GAE 经常落后于主发行版一个或多个主要版本。此外，必须考虑到沙盒环境的限制（参考 [20.1 节](20.1.md)）。因此，如果尝试打开一个 socket 或写一个文件将返回一个 `os.EINVAL` 错误。

因此，把你的 GAE 和非 GAE-Go 工具完全分开；如果你只做 GAE 开发，你可以完全不使用标准工具。在 google_appengine 目录下有几个 Python 脚本，是 Google App Engine 的基本工作程序。确保它们是可执行的（如果不是，请使用 `chmod +x *.py` 命令）。同时将它们的路径添加到 `PATH` 变量中，以便你在调用它们时不必包含完整的路径：例如，如果你有一个 bash shell，在你的 .bashrc 或 .profile 文件中添加一行：

```bash
export PATH=/home/user/google_appengine:$PATH
```

<u>注意：</u>

1) 如果你已经有了一个工作的 Go 环境（就像你在阅读本书时那样），这个  AppEngine 的安装是在它之外的，与它平行而不影响它；特别是您不需要改变您操作系统中的 Go 环境变量。AppEngine 上的 Go 有其自己完全独立的环境，包含自己的 Go 版本（在 "install root"/google_appengine/goroot 目录下）
2) 下载文档也是一个好主意，这样你可以在离线时浏览。从官网下载 google-appengine-docs-20111011.zip 并解压。
3) GAE 大量使用 Python，这在 Mac OS X 和 Linux 上默认安装；如果由于某种原因不是这种情况，请从 www.python.org 下载并安装 Python 2.5。

4. 源代码：库和 SDK 是开源的：http://code.google.com/p/appengine-go/。用以下方法下载：

  ```bash
hg clone https://code.google.com/p/appengine-go/
  ```

5) 一个给定应用程序的所有 Go 包都内置在一个单一的可执行文件中，并且请求调度由 Go 程序本身处理。由 Go 程序本身处理；这与 Java 和 Python SDK 的情况不同。
   在 [第 20.8 节](20.8.md)，我们将看到如何连接到 GAE 云来部署你的应用程序。但在这你将在你刚刚安装的本地GAE环境中开发、测试和运行你的应用程序，这是对开发环境最好的模拟。

### 20.3.2 检查和测试

<u>检查安装：</u>

为了控制一切工作正常，在控制台中进入 google_appengine，通过调用 dev_appserver.py 来调用本地 AppEngine 服务器。

如果你看到以下内容： 

```
Invalid arguments
Runs a development application server for an application.
dev_appserver.py [options]
Application root must be …
```

则一切正常。

<u>运行一个演示应用程序：</u>

在 SDK 捆绑包中有一些演示应用程序。让我们运行一个以确保一切正常。

- 进入 google_appengine/demos：在那里你可以看到一些文件夹，例如 helloworld、guestbook 等。
- 在 demos 目录下，执行命令：`dev_appserver.py helloworld`

注意，这将自动编译、链接和运行 Go 程序。

- 有一些警告以及信息 ，但如果最后一行如下：

  ```
  Running helloworld on port 8080: http://localhost:8080
  ```

  就可以了。此时 helloworld 应用程序已经在本地 AppEngine 服务器中被实例化，并且准备好在 `8080` 端口为您机器上的用户提供服务。

- 打开浏览器并访问 http://localhost:8080

  如果你看到如下页面：

  ​	Hello, World! 세상아 안녕!!

  你就已经成功在本地的 GAE 引擎上运行了一个 Go web 应用了。

  刚才运行的 Go 源代码如下：

  <u>Listing 20.1 helloworld.go:</u>

  ```go
  package helloworld
  import (
  	“fmt”
  	“net/http”
  )
  func init() {
  	http.HandleFunc(“/”, handle)
  }
  func handle(w http.ResponseWriter, r *http.Request) {
  // some Chinese characters after World!
  	fmt.Fprint(w, “<html><body>Hello, World! 세상아 안녕!! </body></html>”)
  }
  ```

  这是一个简单的 web 应用 （参考 [15 章](15.0.md)），其在 `init()` 函数当中就启动了整个的 handler。注意它被它自己的包包含。

## 链接

- [目录](directory.md)
- 上一节：[云上的 Go](20.2.md)
- 下一节：[建造你自己的 Hello world 应用](20.4.md)
