Play 2.0 Scala Heroku实例是';无法查看Procfile中的每个变量

Play 2.0 Scala Heroku实例是';无法查看Procfile中的每个变量,scala,heroku,playframework,cedar,Scala,Heroku,Playframework,Cedar,我在玩!Heroku上的2.0 Scala版本。Heroku似乎没有看到/使用Procfile中的所有配置变量 例如,在my application.conf中,我有以下变量(除其他变量外): 这些应该是本地开发的默认设置。但是,我希望我的Heroku实例使用MongoLabs实例。(不幸的是,Salat没有配置URI,所以我不得不将其分解为主机、端口、yada-yada,即不使用MONGOLAB_URI) 我的Procfile现在如下所示: ☆ cat Procfile

我在玩!Heroku上的2.0 Scala版本。Heroku似乎没有看到/使用Procfile中的所有配置变量

例如,在my application.conf中,我有以下变量(除其他变量外):

这些应该是本地开发的默认设置。但是,我希望我的Heroku实例使用MongoLabs实例。(不幸的是,Salat没有配置URI,所以我不得不将其分解为主机、端口、yada-yada,即不使用MONGOLAB_URI)

我的Procfile现在如下所示:

☆  cat Procfile                                             
web: target/start -Dsecurehostname="https://example.org" \
-Dhostname="http://example.org" -Dhttp.port=$PORT \
-DapplyEvolutions.default=true -Ddb.default.driver=org.postgresql.Driver \
-Ddb.default.url=$DATABASE_URL -Dredis=$REDISTOGO_URL \
-Dmailgun.apikey=$MAILGUN_API_KEY -Dmongodb.default.db="heroku_appXXXXXXX" \
-Dmongodb.default.host="dsXXXXXX.mongolab.com" -Dmongodb.default.port=XXXXX \
-Dmongodb.default.user="heroku_appXXXXXXX" \
-Dmongodb.default.password="foobared_not"
app git:(master) ☆  DATABASE_URL="jdbc:h2:mem:mydatabase;MODE=PostgreSQL" \
  REDISTOGO_URL="redis://ignored:foobared@localhost:6379/" \
  foreman start
20:20:27 web.1     | started with pid 43382
20:20:27 web.1     | Play server process ID is 43382
20:20:29 web.1     | [info] play - database [default] connected at jdbc:h2:mem:mydatabase
20:20:29 web.1     | [info] play - mongodb [default] connected at "heroku_appXXXXXXX"@"dsXXXXXX.mongolab.com":XXXXX/"heroku_appXXXXXXX"
20:20:30 web.1     | [info] play - Application started (Prod)
20:20:30 web.1     | [info] play - Listening for HTTP on port 5000...
push, fail
push (without changes), success, but seemingly with old Procfile
<make change>
push, fail
push (without changes), success, but seemingly with old Procfile
<make change>
push, fail
push (without changes), success, but seemingly with old Procfile
...
我推送并重新启动,但远程MongoDB连接仍然表示它连接到localhost:27017

Redis和其他一切都运行良好

远程日志在启动时显示了这一点,它显然不包含我的Procfile中的所有参数:

2012-05-20T19:35:18+00:00 heroku[web.1]: Starting process with command \
`target/start -Dhostname="https://example.org" -Dhttp.port=XXXXX \
-DapplyEvolutions.default=true -Ddb.default.driver=org.postgresql.Driver \
-Ddb.default.url=<HIDDEN> -Dredis=<HIDDEN> -Dmailgun.apikey=<HIDDEN>`
foreman按照Procfile中的方式提取我的生产MongoDB值,这验证了我的论点,即Heroku可能出于未知原因使用了我的Procfile的旧版本

在我的Heroku实例中,Procfile肯定也没有设置不可变标志:

~ $ lsattr Procfile
------------------- Procfile

更新2

我正在使用

我发现了一个模式:

在我开始实施MongoDB支持之前,每次推送都成功了

然后我整合了,注册了一个Mongonabs帐户,开始了乐趣。上面的插件不支持,并且由于它解析配置的方式,如果你给它
-Dmongodb.uri
,它就会爆炸。它需要一个键空间,如“default”

这让我们回到了我在上面使用的
mongodb.default.*
开关

现在,我的开发周期如下所示:

☆  cat Procfile                                             
web: target/start -Dsecurehostname="https://example.org" \
-Dhostname="http://example.org" -Dhttp.port=$PORT \
-DapplyEvolutions.default=true -Ddb.default.driver=org.postgresql.Driver \
-Ddb.default.url=$DATABASE_URL -Dredis=$REDISTOGO_URL \
-Dmailgun.apikey=$MAILGUN_API_KEY -Dmongodb.default.db="heroku_appXXXXXXX" \
-Dmongodb.default.host="dsXXXXXX.mongolab.com" -Dmongodb.default.port=XXXXX \
-Dmongodb.default.user="heroku_appXXXXXXX" \
-Dmongodb.default.password="foobared_not"
app git:(master) ☆  DATABASE_URL="jdbc:h2:mem:mydatabase;MODE=PostgreSQL" \
  REDISTOGO_URL="redis://ignored:foobared@localhost:6379/" \
  foreman start
20:20:27 web.1     | started with pid 43382
20:20:27 web.1     | Play server process ID is 43382
20:20:29 web.1     | [info] play - database [default] connected at jdbc:h2:mem:mydatabase
20:20:29 web.1     | [info] play - mongodb [default] connected at "heroku_appXXXXXXX"@"dsXXXXXX.mongolab.com":XXXXX/"heroku_appXXXXXXX"
20:20:30 web.1     | [info] play - Application started (Prod)
20:20:30 web.1     | [info] play - Listening for HTTP on port 5000...
push, fail
push (without changes), success, but seemingly with old Procfile
<make change>
push, fail
push (without changes), success, but seemingly with old Procfile
<make change>
push, fail
push (without changes), success, but seemingly with old Procfile
...
…而heroku日志-t的输出仅显示以下内容:

2012-05-22T07:23:59+00:00 heroku[slugc]: Slug compilation failed: unrecognized error
顺便说一句,它在本地工作

我已经引起了Heroku支持部门的注意,因为这可能是因为他们在一开始就可以让事情变得更清楚的时候,会吞下错误

我还要求他们不要让第二次推送成功,而是使用一个旧的Procfile。非常误导

不用说,我现在还实现了对Salat插件的MongoURI支持


更新3

对于游戏中的
mongodb.default.uri
!Salat插件(并使用lib/部署),但每当我在Procfile中推送任何与mongo相关的东西时,Heroku仍会抛出一个错误


我问过Heroku是否支持同样的问题,也许这里有人可以回答:Heroku是否限制了可以在Procfile中使用的变量?

也许有些变量是由插件启用的? 我没有检查heroku api,但它可能是一个线索

第二点是如何访问这些变量,我猜typesafe配置系统不会回退到命令行选项

最后一点是,您可以在类路径的根目录中添加application.conf,它将在生产模式中使用,而不是显式地从conf/中检索它


我的2c

也许有些变量是由插件启用的? 我没有检查heroku api,但它可能是一个线索

第二点是如何访问这些变量,我猜typesafe配置系统不会回退到命令行选项

最后一点是,您可以在类路径的根目录中添加application.conf,它将在生产模式中使用,而不是显式地从conf/中检索它


My 2c

您也可以在application.conf中尝试这样进行配置

我不确定这是heroku、生产模式还是其他什么,但我注意到环境变量设置为'heroku config'时有些奇怪

在application.conf中,如果使用符号

google.client=$(GOOGCLIENTID)
在本地工作站上运行,一切正常。我可以使用“heroku config”验证变量是否已设置,但在heroku上运行时,它显然没有传播到配置中

但是,此符号可以正常工作:

google.client=$(?GOOGCLIENTID)

希望能有所帮助。

您也可以在application.conf中尝试这样的配置

我不确定这是heroku、生产模式还是其他什么,但我注意到环境变量设置为'heroku config'时有些奇怪

在application.conf中,如果使用符号

google.client=$(GOOGCLIENTID)
在本地工作站上运行,一切正常。我可以使用“heroku config”验证变量是否已设置,但在heroku上运行时,它显然没有传播到配置中

但是,此符号可以正常工作:

google.client=$(?GOOGCLIENTID)

希望有帮助。

在$MAILGUN\u API\u密钥中有任何有趣的字符吗?尝试将-Dmailgun.apikey=$MAILGUN\u API\u KEY移到末尾…

在$MAILGUN\u API\u KEY中有任何有趣的字符吗?请尝试将-Dmailgun.apikey=$MAILGUN\u API\u KEY移动到末尾…

注意,Procfile的start命令的长度最多为255个字符。我希望您所有的mongodb配置都远远超出此范围

我建议你参考一本书。对于非从属配置,例如:

web: target/start -Dhttp.port=$PORT -Ddb.default.url=$DATABASE_URL \
-Dredis=$REDISTOGO_URL -Dmailgun.apikey=$MAILGUN_API_KEY \
-Dconfig.resource=heroku-prod.conf
在conf/heroku-prod.conf中:

include "application.conf"                                        

securehostname="https://example.org" 
hostname="http://example.org" 
applyEvolutions.default=true
db.default.driver=org.postgresql.Driver 
mongodb.default.db="heroku_appXXXXXXX"
mongodb.default.host="dsXXXXXX.mongolab.com"
mongodb.default.port=XXXXX \
mongodb.default.user="heroku_appXXXXXXX"
mongodb.default.password="foobared_not"

请注意,Procfile的start命令的最大长度为255个字符。我希望您所有的mongodb配置都远远超出此范围

我建议你参考一本书。对于非从属配置,例如:

web: target/start -Dhttp.port=$PORT -Ddb.default.url=$DATABASE_URL \
-Dredis=$REDISTOGO_URL -Dmailgun.apikey=$MAILGUN_API_KEY \
-Dconfig.resource=heroku-prod.conf
在conf/heroku-prod.conf中:

include "application.conf"                                        

securehostname="https://example.org" 
hostname="http://example.org" 
applyEvolutions.default=true
db.default.driver=org.postgresql.Driver 
mongodb.default.db="heroku_appXXXXXXX"
mongodb.default.host="dsXXXXXX.mongolab.com"
mongodb.default.port=XXXXX \
mongodb.default.user="heroku_appXXXXXXX"
mongodb.default.password="foobared_not"

可能是Heroku插件(不是Play插件)启用了某些变量。我已经向Heroku支持部门询问了这一点(等待答复),因为文档中没有明确说明。Play接受application.conf上的-D开关,这是Heroku初始化我的应用程序的方式。抱歉,我在谈论插件时不清楚。。。实际上我是在说heroku插件。因此,只允许那些由附加组件声明的变量(只是猜测)。对于play 2.0和env变量,有一个