本文介绍了怎样在一个 build里面构建多个项目。
在阅读本文之前,首先请读一下前面的开始指南,尤其是需要了解一下 build.sbt 和 .scala build definition。
Mutiple projects它可以在一个 build 里面构建多个相关的项目,如果它们互相依赖并且你想在一起编辑它们,那就在好不过了。
build 里的每一个 sub-project 都有它自己的 src/main/scala,当你运行 package的时候会生成自己的 jar 文件,就像其它项目一样。
在 .scala 文件里定义项目为了使用 multiple project ,你必须在一个.scala 文件里声明每一个项目并且描述它们之间的联系。这在 .sbt文件里是无法做到的。不管怎样,你可以在 .sbt文件里为每一个项目定义配置,下面是一个 定义了一个根工程 hello 的.scala文件的例子,这个根项目一共有两个 sub-projects,hello-foo 和 hello-bar:
import sbt._ import Keys._ object HelloBuild extends Build { lazy val root = Project(id = "hello", base = file(".")) aggregate(foo, bar) lazy val foo = Project(id = "hello-foo", base = file("foo")) lazy val bar = Project(id = "hello-bar", base = file("bar")) }
sbt使用反射技术来找到 Project 对象的列表的,进而在 Build 对象里寻找 Project 字段。
因为 hello-foo 对象通过 base = file("foo") 来定义,所以它包含一个 foo 的子路径。它的源文件可以在 foo 下面的路径里找到,比如 foo/Foo.scala,或者 /foo/src/main/scala。通过 build 定义文件可以看出,在 foo 下面有 sbt 默认目录结构。
foo 里面的所有的 .sbt 文件,也就是 foo/build.sbt ,将会并入到整个构建的构建定义里,但是不会在 hello-foo 工程里。
如果你的整个工程都在 hello 里,尝试着在 hello/build.sbt ,hello/foo/build.sbt 以及 hello/bar/build.sbt 里面定一个不同的版本(version :="0.6")。然后在sbt 控制台键入 show version。你会得到像这样的结果(取决与你定义的版本):
> show version [info] hello-foo/*:version [info] 0.7 [info] hello-bar/*:version [info] 0.9 [info] hello/*:version [info] 0.5
hello-foo/ 的版本定义在 hello/foo/build.sbt 里面,hello-bar/ 的版本定义在 hello/bar/build/sbt 里面,hello/ 的版本定义在 hello/build.sbt 里面。记住每个语法的范围的 keys(Scopes.html)。每个 version key 对应着项目的一个基于 build.sbt 的范围。但是所有的 build.sbt 都是 build 定义的一部分。
每一个工程的设置都可以在 工程的根目录里面的 sbt 文件里进行配置,就像上面的例子那样,使用 .scala 文件同样也会很简洁的列出了项目以及基本的目录,但是没有必要把配置都放到 .scala 文件里面。
你可能会觉的把一切东西包括配置都放在 .scala 文件里很干净,因为保持了所有的构建定义仅用了一个 project 路径就完成了。好吧,一切随你。
不能在 sub-projects 里面在加一个 project 子路径,那样的话 foo/project/Build.scala 会被忽略的。
集成如果你愿意,项目的构建和另一个完全相互独立。
在上面的例子里,你可能注意到了 aggregate(foo,bar) 方法。它把 hello-foo 和 hello-bar 都放在了根路径下。
集成意味着在一个集成的工程里面运行任务的同时运行这个集成的工程。这个例子里我们用 sbt 启动两个子项目,并尝试编译。你将会看到三个项目都被编译了。
在根项目 hello 里在集成项目,你可以控制每一个任务。
aggregate in update := false
aggregate in update 是描述更新任务的范围的全局量,见 scopes。
注意:在没有定义顺序的情况下,项目会按照字母排列顺序运行。
Classpath 依赖一个项目可能会依赖其它的项目。调用 dependsOn 方法来实现。例如,如果 hello-foo 需要使用 classpath里面有 hello-bar 的类,你可以在你的 Build.scala 里面这样写。
lazy val foo = Project(id = "hello-foo", base = file("foo")) dependsOn(bar)
现在 hello-foo 可以使用 hello-bar 里面的类了。它还会在编译它们的时候创建一个顺序:hello-bar 必须在hello-foo 编译之前更新编译。
为了更方便的使用于mutiple projects,在dependsOn 里面可以使用多个参数,如 dependsOn(bar,baz)。
依赖里面classpath的每一个配置foo dependsOn(bar) 意味着 foo 里面的 Compile 配置依赖于bar 里面的 Compile 配置。 你也可以这样写 dependsOn(bar % "compile->compile")。
compile->compile 里面的 -> 意味着依赖于,所以 test->compile 意味着 Test 里面的 foo 配依赖于 bar 里面的编译配置。
省略的 ->config 部分意味着 ->compile, 因此 dependsOn(bar % "test") 意味着foo 里面的 Test 配置bar 里面的 Compile 配置。
一个有用的写法是 test->test,意味着 Test 依赖于 Test。比如,它允许你在 bar/src/test/scala 里面测试代码,接着又在 foo/src/test/scala 里面测试。
在sbt 控制台提示符下输入 projects 来列出有的工程,输入 project 来选择一个做为当前的工程。当你运行像 compile
你可以在一个依赖里面使用多个配置,使用分号分隔。例如, dependsOn(bar % "test->test;compile->compile").
Navaigating 项目的集成在 sbt 控制台输入 project 来列出你所有的项目,project 来选择一个当前使用的项目。当你使用类似 compile 的命令时,是在当前项目里执行的。所以你不必编译根项目,你只需要在一个子项目里 compile。
共享设置当在不同的项目里面使用一个 .scala 配置文件时,在不同的项目中间重用配置是很方便的。但是即使是使用不同的 buid.sbt 配置文件,在 main build 里面使用共享的配置依然很方便,只需要对相应的配置使用 ThisBuild 来把它应用的全局范围。例如,当 main 项目依赖于一个子项目时,为了这两个项目使用同一个版本的Scala 来编译。可以在 build.sbt 文件里面这样写一次:
scalaVersion in ThisBuild := "2.10.0"
把 2.20.0 替换成相应的 Scala 版本。这个设置会在所有的子项目里面生效。也可以在 “page on scope ”Thisbuild 处获得更多信息。
继续学习自定义配置。
- 远程调试器
- Windows凭证
- pdb符号文件
- 进程调试(远程调试)
准备调试器
- 将“安装路径 \Microsoft Visual Studio 10.0\Common7\IDE\Remote Debugger”拷贝至服务器S上运行
- 在客户机B上使用“telnet 服务器地址 4016”确定与服务器S的“远程调试器”的连接畅通
在客户机B上使用VS进行调试
- 点击菜单“调试/附加到进程...”后,将服务器的IP或主机名填写至“限定符”文本框后回车,在下面的列表框中选择“ConsoleApplication.exe”后点击“附加”
- 点击菜单“调试/窗口/模块”,右击ConsoleApplication.exe模块选择“符号设置...”,并在弹出来的对话框中将pdb文件所在的目录加入进入后点击确定,然后再点击模块选择“加载符号”
- 打开“*.cs”源代码文件(不需要打开整个工程)后下断点调试
这篇文章主要为那些不愿意学VIM或没买sourceinsight的人准备的,因为其实上述的两个工具已经能够很好的帮助我们看代码了。楼主之所以没有使用上述工具,一是觉得VIM的配色略丑,也不太熟练;二是目前Team没有SI的KEY,所以就找其他方法了,闲着也是闲着。好了,废话少说,进入正题,先给出效果图:
--doxygen
--sublime2
这样我们就可以使用Doxygen查看代码,通过Graphviz产生函数调用图来看调用关系。可能有人会问,Sublime和vi有什么区别,为什么还需要使用它,原因主要有两个,一是搜索文件非常迅速,支持函数定位,变量定位,文件定位,速度很快,弥补了Doxygen找变量文件费力的问题;二是写代码确实很方便,可以安装各种插件。
安装方法:
1 下载Doxygen,去官网
2 下载Graphviz,去官网
3 下载Sublime text 2 ,去官网。。
使用:
1 Doxygen & Graphviz
打开Doxygen Wizard,会有配置面板,主要有向导和专家两种配置方式,建议在专家方式中选择自己需要的方式,
PROJECT标签:主要填写的是Doxygen的大的工作目录,本次项目的名字,输出目录,
BUILD标签:除了默认的,再勾选这些
sourcebrowser: 我需要查看代码,所以勾选Inline sources和souce Browser
Dot: 这里可以勾选CLASS_DIAGRAMS/HAVE_DOT/CALL_GRAPH/CALLER_GRAPH/DOT_PATH
然后就可以点RUN标签,运行后,会生成HTML,查看INDEX.HTML既可以看到结果。
可能会有些童鞋遇到无法生成或失败,检查dot文件能否运行,有的XP没有装.NET FRAMWORK2 会出问题
2 Sublime 2
sublime 的项目管理很简单,只要打开某个文件夹,在project中保存就可以了
我在使用的时候,装了几个插件:Alignment, Bracket Highlight, ctags .sublimecodeintel, sublimelinter, Themr
插件的具体使用方法就不多介绍了,网上搜搜一大堆。。
主要使用的快捷键:
ctrl+p(快速定位项目中的文件)
加上# 和 @ 分别为变量和函数,其实搜变量也能搜到函数。
如果装了CTAGS,那么还可以使用快速找到函数的定义,或者变量等等
总而言之,这是一个适合长久使用的工作方法,查看代码与编写代码。
不过Doxygen的缺点也是很明显的,对于大型工程,会遇到Crush或者速度非常慢(- -|)。但是呢,有利有弊是肯定的,只要用好了,习惯了就行。