使用Shake Haskell构建库,如何使用需要达到固定点的程序编写规则?想象一下,我有一个程序foo
,它接受一个文件input
并生成一个输出文件,应该foo
重复应用,直到输出文件没有改变.我怎么能在Shake中写出来?
这种模式的典型例子是LaTeX.
在Shake文档中,它建议使用标志-with-rtsopts=-I0
进行编译以禁用空闲垃圾回收.为什么Shake建议这样做?
我正在尝试使用Shake来构建Java代码,由于javac编译器的不寻常特性,我有点卡住了.通常,对于大型项目的每个模块,将使用该模块的所有源文件作为输入调用编译器,并在一次传递中生成所有输出文件.随后我们通常采用编译器生成的.class文件并将它们组装成JAR(基本上只是一个ZIP).
例如,典型的Java模块项目安排如下:
src
包含多个.java文件的目录,其中一些嵌套在树的深层.bin
包含编译器输出的目录.典型地,这输出遵循相同的目录结构和文件名,以.class
取代对每个java文件,但该映射是不必然一到一种:单java文件可以产生零到许多.class文件!因此,我想在Shake中定义的规则如下:
1)如果下面的任何文件src
比任何文件更新,bin
则擦除所有内容bin
并重新创建:
javac -d bin <recursive list of .java files under src>
我知道这个规则似乎过多,但是如果不调用编译器,我们就无法知道输出的变化程度,即使是单个输入文件中的一个小变化也是如此.
2)如果任何文件bin
比新文件更新,module.jar
则重新创建module.jar
:
jar cf module.jar -C bin .
非常感谢!
PS响应"只使用Ant/Maven/Gradle /"将不胜感激!我知道这些工具提供开箱即用的Java编译,但它们更难以编写和聚合.这就是为什么我想试验一个基于Haskell/Shake的工具.
我有一个Haskell程序,我想用GHC编译,由Shake构建系统编排.我应该执行哪些命令,以及在什么情况下应该重新运行?
我正在研究Python/Haskell项目,我正在寻找替代方案Makefile
.明显的选择是Python SCons和Haskell Shake.由于我对其中任何一个都没有经验,我想问一下他们的缺点和优点是否有任何比较.
更新:该项目对构建有一些复杂的要求:
python
,flock
等等)在某些情况下,我想非常快速地知道某个目标文件是否是最新的,即是否使用摇动构建它会运行任何传递给目标的规则.
摇动实现这一目标的最佳方法是什么?
我的问题与Shake有些相关:表示是否必须重建任何东西.但是,我不想运行实际构建,因为我不想触摸任何构建产品.
在可能的情况下,Shake并行构建事物,但如果单个构建步骤本身可并行化会发生什么?例如,我正在运行BLAST命令.每个命令都比较两个物种的基因组.几个比较可以并行运行,但也有一个标志将比较分成N个块并并行运行.我是否需要选择一种方法来分割作业并坚持下去,或者我可以告诉Shake"整体使用N个线程,以及每个特定任务自己占用N个线程的方式"?
(当比较许多小细菌基因组和一些较大的真核细胞基因组时会出现这种情况)
编辑:问题可以简化为"如何判断Shake当前正在运行/排队的Shake线程数量?"
是否有可能使用inotify(或任何git-annex和Yesod使用)使Shake成为被动的,这样如果文件系统以某种方式改变以暗示该规则应该执行,那么它是否应该尽早实现?
我正在尝试将现有的makefile迁移到Shake,到目前为止我已尝试过以下内容(只需创建一个包含目录内容的文件)
module Main where
import Development.Shake
main :: IO ()
main = shakeArgs shakeOptions{shakeFiles="_build"} $ do
let ls = "_build/ls.txt"
want [ls]
ls *> \out -> do
cmd "ls > " out
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我收到以下错误消息:
> runghc test.hs _build/ls.txt
# ls (for _build/ls.txt)
ls: >: No such file or directory
ls: _build/ls.txt: No such file or directory
Error when running Shake build system:
* _build/ls.txt
Development.Shake.cmd, system command failed
Command: ls > _build/ls.txt
Exit code: 1
Stderr:
ls: >: No such file …
Run Code Online (Sandbox Code Playgroud) 我有一个震动构建(版本 0.16.4),它从Dockerfile
s 和其他支持文件中构建了很多 docker 图像。我想将所有这些构建在一个“规则”中,其输出将是一个 docker 图像。我已经阅读了如何在 Shake 中定义计时器规则关于shake 中的自定义规则,但这并没有解释如何定义自己的输出。
我想表达类似的东西
Image "foo" "latest" %> \ img -> do
need [ ... ]
buildDockerImage "docker/foo" img
Image "bar" "latest" %> \ img ->
needImage "foo" "latest"
...
Run Code Online (Sandbox Code Playgroud)
然后将图像作为依赖项进行抖动跟踪。我已经在旧版本的shake中实现了那种东西,但我对如何在> 0.16中做到这一点一无所知。
更新:
我已经尝试过这个,遵循https://hackage.haskell.org/package/shake-0.17.3/docs/Development-Shake-Rule.html的指导方针
newtype Repo = Repo String
deriving (Show, Eq, Hashable, Binary, NFData)
newtype Tag = Tag String
deriving (Show, Eq, Hashable, Binary, NFData)
newtype SHA256 = SHA256 String
deriving (Show, Eq, …
Run Code Online (Sandbox Code Playgroud)