如何修复Google-cloud-sdk 156.0.0版本中的"There are too many files in your application for changes in all of them to be monitored."错误?

12
我刚刚在osX上安装了Go 1.6.4和google-cloud-sdk 1.56.0.0。
当我尝试运行本地dev_server时,我收到以下警告:
/Users/Bryan/go/src/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/mtime_file_watcher.py:156: UserWarning: There are too many files in your application for changes in all of them to be monitored. You may have to restart the development server to see some changes to your files.
如何解决这个问题?
这是项目文件,只有4个文件。
$ ls
total 32
drwxrwxrwx   6 Bryan  staff   204 May 23 15:57 .
drwxr-xr-x  10 Bryan  staff   340 May 25 18:39 ..
-rwxrwxrwx@  1 Bryan  staff    69 Mar 22 09:40 app.yaml
-rw-r--r--   1 Bryan  staff   554 Mar 28 09:26 index.yaml
-rwxrwxrwx@  1 Bryan  staff  3015 May 25 18:36 skincare.go
-rw-r--r--   1 Bryan  staff   870 May  3 09:18 skincare_test.go

我也遇到了一个问题,就是"go get"尝试编译代码而不是下载远程包"google.golang.org/appengine"。 $ go get
# import "google.golang.org/appengine" is ignored and "go get" yields this error:
./skincare.go:31: undefined: appengine.Context

编辑额外信息: 我尝试使用-u标志强制更新:
$ go get -u

package skincarereview: directory "/Users/Bryan/go/src/skincarereview" is not using a known version control system

当我尝试运行本地服务器时,出现了以下错误输出:

$  /Users/Bryan/go/src/google-cloud-sdk/bin/dev_appserver.py app.yaml
INFO     2017-05-30 14:27:31,722 devappserver2.py:692] Skipping SDK update check.
INFO     2017-05-30 14:27:31,785 api_server.py:272] Starting API server at: http://localhost:60703
INFO     2017-05-30 14:27:31,789 dispatcher.py:205] Starting module "default" running at: http://localhost:8080
INFO     2017-05-30 14:27:31,793 admin_server.py:116] Starting admin server at: http://localhost:8000
/Users/Bryan/go/src/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/mtime_file_watcher.py:156: UserWarning: There are too many files in your application for changes in all of them to be monitored. You may have to restart the development server to see some changes to your files.
  'There are too many files in your application for '
ERROR    2017-05-30 14:27:36,123 go_runtime.py:182] Failed to build Go application: (Executed command: /Users/Bryan/go/src/google-cloud-sdk/platform/google_appengine/goroot/bin/go-app-builder -app_base /Users/Bryan/go/src/skincarereview -arch 6 -dynamic -goroot /Users/Bryan/go/src/google-cloud-sdk/platform/google_appengine/goroot -gopath /Users/Bryan/go -nobuild_files ^^$ -incremental_rebuild -unsafe -binary_name _go_app -extra_imports appengine_internal/init -work_dir /var/folders/mw/0y88j8_54bjc93d_lg3120qw0000gp/T/tmpEOVMVuappengine-go-bin -gcflags -I,/Users/Bryan/go/src/google-cloud-sdk/platform/google_appengine/goroot/pkg/darwin_amd64_appengine -ldflags -L,/Users/Bryan/go/src/google-cloud-sdk/platform/google_appengine/goroot/pkg/darwin_amd64_appengine skincare.go skincare_test.go)
/var/folders/mw/0y88j8_54bjc93d_lg3120qw0000gp/T/tmpEOVMVuappengine-go-bin/skincare.go:31: undefined: "google.golang.org/appengine".Context

2017/05/30 10:27:36 go-app-builder: build timing: 0×skip (5ms total), 11×compile (2.128s total), 0×link (0 total)
2017/05/30 10:27:36 go-app-builder: failed running compile: exit status 2

1
我的猜测是开发服务器监控GOPATH中所有.go文件,除了应用程序目录中的文件。默认情况下,如果包已经在GOPATH中,则go get不会下载。使用go get -u从源代码强制更新。 - Charlie Tumahai
那是否意味着我的GOPATH(/Users/Bryan/go)是错误的? - BryanWheelock
我认为GOPATH没有问题。此外,这只是有关自动重新编译的警告。其他所有功能都应该正常工作。 - Charlie Tumahai
1
在安装 google-cloud-sdk 时,你没有遵循我在你的另一个问题中给出的指示。SDK本身应该放在你的 home 目录下,而不是 $GOPATH。从技术上讲,只要 SDK 在你的 $PATH 中,它在哪里都无所谓,但绝对不应该放在 $GOPATH 中。https://dev59.com/oVcP5IYBdhLWcg3w8uZi#43641355 - RayfenWindspear
4个回答

3

我只使用了一个较旧版本的appengine sdk,但我相信以下内容仍然是正确的。

主要问题是您在GOPATH中有google-cloud-sdk。这不是必需的。我已经将其安装在我的路径中。但即使没有安装,它也应该相对于您运行的可执行文件或脚本来解析其位置,并正确地找到所有所需的sdk文件。同时,SDK大约有7500个文件,而您只需要在GOPATH中拥有超过10000(约)个文件才能获得“文件太多”警告。因此,如果您在同一GOPATH中有另一个(例如较旧的)SDK副本或其他大型项目,则几乎可以保证超过阈值。只需在Finder中定位/ Users / Bryan / go并使用“获取信息”来计算文件。

因此,要么将appengine SDK移动到GOPATH之外。要么创建一个新文件夹,将其导出为新的GOPATH,并将项目文件(但不包括SDK)移动到该新文件夹中。这应该修复“文件太多问题”。

另一个问题是您的应用程序实际上无法构建。正如您自己已经发现的那样,(立即)问题是缺少appengine软件包。

但获取google.golang.org/appengine的正确方法如下: go get google.golang.org/appengine

请记住,在运行上述命令之前,必须正确设置GOPATH。它将获取google.golang.org/appengine及其所有依赖项。

一旦检索到所有所需的软件包(如果有错误,请修复),它应该可以编译和运行而无需任何问题。


我认为google-cloud-sdk应该在@ /go/src中。/go/src只包含我的代码和依赖项,而不包括google-cloud-sdk吗? - BryanWheelock
包google.golang.org/appengine:无法下载,$GOPATH未设置。有关更多详细信息,请参见:go help gopath - BryanWheelock
1
大多数Go语言中的第三方SDK或库都被打包成一个Go包,您可以将它们“go get”到您的src文件夹中。但是Google Cloud SDK不仅仅是一个Go包,而是一个完整的SDK。因此,它不需要在您的GOPATH中。将GOPATH视为其他语言中的项目文件夹。Google Cloud SDK类似于Windows平台SDK或Java JDK。两者都不需要在每个项目文件夹中都有一份副本。 - Seva
1
$GOPATH只是一个环境变量。只需将其设置为您的项目文件夹即可。例如,在您的示例中,如果您正在使用命令行(如终端),请执行以下操作:export GOPATH=/Users/Bryan/go。然后在同一终端窗口中运行go get命令即可。 - Seva
@Dewey 请查看上面的评论。Google App Engine SDK for Go是一个SDK,而不仅仅是一个包。请参阅App Engine SDK文档中的安装说明并遵循它们。然而,google.golang.org/appengine是一个包。它可能实际上是由较新版本的SDK提供的,但至少在撰写本文时不是这样的。因此需要使用go get将其获取到GOPATH中。 - Seva
显示剩余2条评论

3

我的当前 SDK 版本是(Google Cloud SDK 171.0.0),dev_appserver.py 工具有一个选项名为 enable_watching_go_path

将其设置为 False 即可消除警告。

我使用的命令是:dev_appserver.py --enable_watching_go_path=False server/app.yml


2
当 mtime_file_watcher.py 尝试监控 "GOPATH" 下的所有文件但文件过多时,会出现相应的错误。因此,可以使用 app.yaml 的 skip_files 选项来排除要监视的许多项目,从而避免检查 vendor、node_modules 和任意数量的文件。 https://cloud.google.com/appengine/docs/standard/python/config/appref#skip_files
skip_files:
- .*node_modules
- .*vendor
- .*project-name-having-too-many-files

0

我正在使用仅适用于Go的App Engine SDK(1.9.54),而不是Cloud SDK,但遇到了相同的问题[Goapp serve - Warning: There are too many files

我通过将大型包和存储库移动到vendor/目录中来解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接