你会喜欢一些帮助
解
在电梯邮件列表中提出问题。
讨论
你会发现约在计算器上,Quora的电梯的一些信息,和其他地方,但邮件列表中去寻求帮助和支持的地方。您可以搜索档案查看您的问题是否已被解决,但问题非常受欢迎,因为它有助于电梯社区了解用户需要什么以及可能导致问题或需要解释的内容。您在这里阅读的大部分内容源于在邮件列表中提出的问题。
邮寄名单上的新成员受到主持,有助于减少垃圾邮件。这意味着您第一次发布,您的消息可能需要几个小时才能显示。
也可以看看
电梯社区是使电梯成为事物之一。请在发布之前查看http://liftweb.net/community:您会得到最好的回应与礼貌的问题。
如果您需要付费咨询,开发或SLA支持的支持,则有一个维基上的组织列表。
如何报告错误
解
在电梯邮件列表中讨论你的发现,描述你看到的内容,以及你期望看到的内容。
通过查看现有门票,看看您的问题是在哪里还是最近修正,但请不要提起门票,除非电梯提交者在邮件列表中要求这样做。
讨论
如果电梯不符合您的期望,请提出有关您看到的内容的问题。这些问题的理想形式是“当我做X,我的电梯应用程序是Y,但我期望它做Z,为什么?这提供了一组语言来讨论您的应用程序和Lift对请求的响应方式。也许有一种改善电梯的方法。也许在电梯里有一个不同于你可能习惯的概念。也许有一个文档问题可以帮助弥补电梯正在做的事情和您期望做的事情之间的差距。最重要的是,只是因为Lift的行为与预期的不一样,它不一定是Lift的错误。 | |
- David Pollack http://bit.ly/lift-expects |
帮助您解决问题的一个很好的方法,或者修复错误,是生成一个小例子来说明问题并将其发布在GitHub上。关键在于提供说明,以便有人可以运行示例,并查看您所看到的内容,而无需跳过环。
也可以看看
您可以在http://ticket.liftweb.net/找到一张门票列表。
如果您被要求或想要发布示例代码,请按照指南。
如果您发现了一个错误,并且您被要求创建一张机票,那么主要的工作就是包括一个链接到邮件列表讨论的问题,如创建门票所述。
提供小代码更改和ScalaDoc
解
您可以针对Lift来源发出提取请求,只要您的更改符合以下要求之一:
- 这是对评论的更改。
- 这是示例代码。
- 这是Lift 的一个小小改变,增强或错误修复。
您的拉取请求必须包含编辑,以将您的签名添加到contribut.md文件的底部。
讨论
历史上,电梯有一个严格的贡献者政策,根本不接受任何代码贡献,除了提交者谁签署了一个协议,为电梯项目分配版权。这样就可以让公司在采取电梯的情况下这样做,而不需要诉讼。
安全仍然存在,现在通过对贡献者文件的签名要求,内容如下:
通过提交包含我的姓名和电子邮件地址(电子邮件地址可能是非机器人可读取的格式)的此拉动请求,我同意所有的贡献是我自己的原始工作,以前没有关于这项工作的索赔包括但不限于与我的雇主或其他合同有任何协议,并且我根据Apache 2.0许可证许可此工作。
有什么小的变化?这是一个很好的问题,如果您不确定,请在邮件列表中提及您提出的更改。
也可以看看
这一贡献政策是在2012年11月推出的。
该contributors.md文件被发现在GitHub上。
Lift源位于GitHub上。该框架的项目可能是你想要的,虽然你也可以找到例子和提升网站有Git仓库。
GitHub提供了拉请求的介绍。
“在模块中共享代码”介绍如何通过升降模块共享任意大小的代码。
贡献文件
解
更新或添加到Lift wiki。
您将需要使用承载该维基的公司Assembla登录或创建一个免费帐户。然后,您需要成为Lift wiki 的观察者,该Wiki将作为Lift wiki页面右上角的链接提供。作为观察者,您可以编辑页面并创建新页面。
讨论
如果您不确定要进行的更改,只需在“电梯”邮件列表中查询反馈。
Assembla上观察者角色的一个限制是您无法移动页面。如果您在错误的部分创建新页面,或想重新组织页面,则需要在Lift邮件列表中询问有权为您执行此操作的人员。
也可以看看
维基页面的标记格式是纺织品。
如何添加新的食谱到这本食谱
讨论
任何让你感到困惑的事情,或者让你感到惊讶的事情,给你留下了深刻的印象,或者是非显而易见的是食谱的好主题。欢迎对现有食谱进行改进,讨论和澄清。
食谱使用标记语言AsciiDoc进行结构化。如果您熟悉Markdown或Textile,您会发现相似之处。对于食谱,您只需要了解部分标题,源代码格式和链接。所有这些的示例都在template.asciidoc文件中。
要了解在哪里进行更改,您需要知道每一章是一个单独的文件,每个食谱是该文件中的一个部分。
也可以看看
这本书的来源是GitHub。
AsciiDoc作弊书是进入AsciiDoc的一种快速方法,但如果您需要更多信息,则AsciiDoc主页有详细信息。
GitHub提供了拉请求的介绍。
“提供文件”描述了向Lift提供文档的其他方式。
在模块中共享代码
解
创建电梯模块,然后从您的电梯项目中引用该模块。
作为一个例子,我们创建一个模块,将您的Lift Web应用程序中的每一页都嵌入暴风雪降雪效果(请不要这样做)。
模块没有什么特别的:它们像任何其他依赖项一样被编码,打包和使用。使他们成为可能的是通过扩展点的曝光LiftRules
。主要惯例是提供init
Lift应用程序可用于初始化模块的方法。
对于我们的暴风雪,我们将打包一些JavaScript并将脚本注入每个页面。
与开始lift_blank从下载的模板liftweb.net,我们可以删除所有的源文件和HTML文件,因为这不会是本身可运行的电梯应用。然而,它将使我们与常规Lift结构和构建配置。
我们的模块将需要作为资源/ toserve / snowstorm.js复制的暴雪JavaScript文件。这将把JavaScript文件放在我们的Lift应用程序的类路径上。
模块的最后一块是确保每个页面都包含JavaScript:
package
net.liftmodules.snowstorm
import
net.liftweb.http._
object
Snowstorm
{
def
init
()
:
Unit
=
{
ResourceServer
.
allow
{
case
"snowstorm.js"
::
Nil
=>
true
}
def
addSnow
(
s
:
LiftSession
,
r
:
Req
)
=
S
.
putInHead
(
<
script
type
=
"text/javascript"
src
=
"/classpath/snowstorm.js"
></
script
>
)
LiftSession
.
onBeginServicing
=
addSnow
_
::
LiftSession
.
onBeginServicing
}
}
在这里,我们将插入到电梯的处理管道中,并将所需的JavaScript添加到每个页面的头部。
我们修改build.sbt给模块一个名称,组织和版本号。我们还可以删除许多依赖和Web插件,因为我们只依赖于Lift的Web API元素:
name
:=
"snowstorm"
version
:=
"1.0.0"
organization
:=
"net.liftmodules"
scalaVersion
:=
"2.9.1"
resolvers
++=
Seq
(
"snapshots"
at
"http://oss.sonatype.org/content/repositories/snapshots"
,
"releases"
at
"http://oss.sonatype.org/content/repositories/releases"
)
scalacOptions
++=
Seq
(
"-deprecation"
,
"-unchecked"
)
libraryDependencies
++=
{
val
liftVersion
=
"2.5"
Seq
(
"net.liftweb"
%%
"lift-webkit"
%
liftVersion
%
"compile"
)
}
我们可以通过启动SBT并输入以下内容将该插件发布到磁盘上的存储库:
publish-local
随着我们的模块的建立和发布,我们现在可以将它包含在我们的电梯应用程序。要做到这一点,修改Lift应用程序的build.sbt以引用这个新的“暴雪”依赖:
libraryDependencies
++=
{
val
liftVersion
=
"2.5"
Seq
(
...
"net.liftmodules"
%%
"snowstorm"
%
"1.0.0"
,
...
在我们的Lift应用程序的Boot.scala中,我们终于初始化了插件:
import
net.liftmodules.snowstorm.Snowstorm
Snowstorm
.
init
()
当我们运行升降机应用程序时,由模块提供的每一页白雪将落下。
讨论
该模块是自包含的:用户不需要复制JavaScript文件或修改其模板。为了实现这一点,我们已经使用了ResourceServer
。当我们通过引用JavaScript文件/classpath/snowstorm.js,电梯将尝试查找snowstorm.js从classpath。这就是我们的Lift应用程序所需要的,因为snowstorm.js将在模块JAR文件中。
但是,我们不希望将类路径中的所有文件公开到访问我们的应用程序的任何人。为了避免这种情况,电梯看起来对资源的内部toserve文件夹,这对于我们来说意味着内部文件和文件夹的src /主/资源/ toserve。你能想到的/ classpath中意思toserve(不过,你可以通过改变这些值LiftRules.resourceServerPath
和ResourceServer.baseResourceLocation
)。
作为进一步的预防措施,您需要明确允许访问这些资源。这样做:
ResourceServer
.
allow
{
case
"snowstorm.js"
::
Nil
=>
true
}
我们只是true
为任何要求这个资源的人返回,但是如果我们想要的话,我们可以动态地控制访问。
S.putInHead
将JavaScript添加到页面的头部,并在每个页面上LiftSession.onBeginServicing
触发(同时在“创建会话(或销毁)时运行代码”中讨论))。我们可以利用Req
这里将暴风雪限制在特定页面上,但是我们将其添加到每个页面。
希望你可以看到在Lift应用程序中可以做的任何事情都可以变成Lift模块。一个典型的方法可能是在Lift应用程序中具有功能,然后将设置归因于Boot
模块init
方法。例如,如果您想要将REST服务作为模块提供,那么这是可能的,而且是Lift PayPal模块采取的一种方法。
使您的模块可用
如果您希望更广泛的受众使用您的模块,则需要将其发布到公共存储库,例如Sonatype或CloudBees。您还需要使您的模块与Lift版本保持同步。这里有几个约定。
一个约定是将Lift“edition”作为模块名称的一部分。例如,Lift 2.5 的您的foo模块的1.0.0版将具有名称foo_2.5。这使您清楚您的模块与Lift兼容2.5,包括里程碑,发布候选,快照和最终版本。这也意味着您只需要发布一次模块,至少在升级2.6或3.0可用之前。
管理更新的一种方法是对模块构建进行修改,以允许Lift版本号更改。这样可以在新版本的Lift发布时自动化构建。为此,在您的模块中创建项目/ LiftModule.scala:
import
sbt._
import
sbt.Keys._
object
LiftModuleBuild
extends
Build
{
val
liftVersion
=
SettingKey
[
String
](
"liftVersion"
,
"Full version number of the Lift Web Framework"
)
val
liftEdition
=
SettingKey
[
String
](
"liftEdition"
,
"Lift Edition (short version number to append to artifact name)"
)
val
project
=
Project
(
"LiftModule"
,
file
(
"."
))
}
这定义了一个设置来控制Lift版本号。你使用它在你的模块build.sbt像这样:
name
:=
"snowstorm"
organization
:=
"net.liftmodules"
version
:=
"1.0.0-SNAPSHOT"
liftVersion
<<=
liftVersion
??
"2.5-SNAPSHOT"
liftEdition
<<=
liftVersion
apply
{
_
.
substring
(
0
,
3
)
}
name
<<=
(
name
,
liftEdition
)
{
(
n
,
e
)
=>
n
+
"_"
+
e
}
...
libraryDependencies
<++=
liftVersion
{
v
=>
"net.liftweb"
%%
"lift-webkit"
%
v
%
"provided"
::
Nil
}
请注意"provided"
构建文件中Lift的配置。这意味着当您的模块使用时,Lift的WebKit版本将是由使用您的模块的人员构建的应用程序提供的版本。
以前的代码为您提供了一种方式,使您的模块依靠Lift(“2.5”),而不会将模块锁定在特定版本中,如果它恰好用“2.5-SNAPSHOT”构建。通过使用设置liftVersion
,我们可以通过脚本控制所有模块的版本。这是我们在每次升降机释放后发布一系列升降机模块的,如Lift wiki所述。
当您的模块构建时,不要忘记在Lift邮件列表中通知您。
调试你的模块
当在一个模块上工作并在Lift应用程序中进行测试时,每次更改模块时都必须发布模块。幸运的是,SBT允许您的Lift应用程序依赖于模块的来源。要使用此选项,请更改Lift项目以删除对已发布模块的依赖关系,而通过创建项目/ LocalModuleDev.scala来添加本地依赖关系:
import
sbt._
object
LocalModuleDev
extends
Build
{
lazy
val
root
=
Project
(
""
,
file
(
"."
))
dependsOn
(
snow
)
lazy
val
snow
=
ProjectRef
(
uri
(
"../snowstorm"
),
"LiftModule"
)
}
我们假设相对于我们正在使用的Lift应用程序,可以在../snowstorm找到暴风雪源。有了这一点,当您构建Lift项目时,SBT将自动编译并依赖于本地snowstorm
模块中的更改。
也可以看看
最初,电梯包括一组模块,但这些模块已经分离出来到单独的项目。“贡献小代码更改和ScalaDoc”中概述的升降机贡献者政策不适用于Lift模块:您可以随意向其他开源项目提供这些模块。
可以通过http://liftmodules.net访问模块的Lift wiki页面。
“暴风雪”项目自2003年以来一直在“全球每年冬天都会启动CPU”,而为这个配方开发的模块是在GitHub上开发的。
要发布到Sonatype,请查看他们的指南。CloudBees提供了一个开源存储库。
在Lift应用程序之间还有其他的方法来构建通用代码。有关使用SBT模块和Git的示例,请参阅关于“模块化升级应用程序”的邮件列表讨论。