Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何使用shake将虚假目标声明为默认操作?_Haskell_Shake Build System - Fatal编程技术网

Haskell 如何使用shake将虚假目标声明为默认操作?

Haskell 如何使用shake将虚假目标声明为默认操作?,haskell,shake-build-system,Haskell,Shake Build System,我正在将Makefile转换为Shakefile,我不知道如何处理虚假的make目标(clean,install,等等)。我试过这样的方法: main = shake shakeOptions $ do want ["install"] "install" *> \_ -> do need ["mytarget"] system' "ln" ["-s", "mytarget", "linkname"] 它在创建符号链接时成功,但报告错误“error,rule

我正在将Makefile转换为Shakefile,我不知道如何处理虚假的make目标(
clean
install
,等等)。我试过这样的方法:

main = shake shakeOptions $ do
  want ["install"]
  "install" *> \_ -> do
    need ["mytarget"]
    system' "ln" ["-s", "mytarget", "linkname"]
它在创建符号链接时成功,但报告错误“error,rule”install“未能生成文件:install”


因此,如果不使用“想要”操作,我如何声明我要运行的默认目标是虚假目标?

在shake-0.9和以下版本中,虚假目标是shake中的一个薄弱点-您可以执行这些操作,但它们比应该的更为详细和手动。以下是一些选项:

让安装规则生成一个文件

作为一个非常简单的解决方案,只需在
install
规则的底部添加
writeFile'install”“
。这将生成一个虚拟文件,但每次
mytarget
更改时,它都将重新运行。如果您想让它在每次请求安装时运行(就像一个冒牌货一样),只需添加
AlwaysRun
。如果可以忽略冗余文件,这是最简单的解决方案,直到有一流的虚假支持

使用
操作

你可以写:

main = shake shakeOptions $ do
  action $ do
    need ["mytarget"]
    system' "ln" ["-s", "mytarget", "linkname"]
这声明了在每个生成上运行的操作。实际上,您可能只希望在命令行上有
install
时运行此命令,因此您可以执行以下操作:

main = do
  args <- getArgs
  shake shakeOptions $ do
    when ("install" `elem` args) $ action $ do
      ... install code ...

这使您能够完全控制目标的处理方式,因此您可以执行比虚假目标更强大的操作,但需要更多的工作。

在shake-0.10.1及更高版本中,您可以使用
虚假
函数编写:

main = shakeArgsWith shakeOptions [] $ \_ targets ->
  if "clean" `elem` targets then do
    removeFiles "_make" "//*"
    return Nothing
  else return $ Just $ do
    when ("install" `elem` targets) $ do
       ... install code ...
    ... other rules ...
    want $ delete "install" targets
main = shake shakeOptions $ do
  want ["install"]
  phony "install" $ do
    need ["mytarget"]
    system' "ln" ["-s", "mytarget", "linkname"]

这应该完全满足您的需要,并且不需要生成假文件。此外,您可能希望使用
shakeArgs
而不是
shake
,以便用户可以从命令行选择
install
,或者选择另一个目标,例如clean。

谢谢,我将遵循第一个解决方案。我现在添加了
phony x f=x*>\o->(AlwaysRun>>writeFile'x”“>>f o)
,这样我就可以
“安装”'phony'\\\u->do…
@Hudon,在shake-0.10中,你可以做得更好-查看我的其他答案(尽管这个答案仍然很有用,因为变通方法可能对其他事情有用)。将接受的答案改为这个,因为这正是我真正想要的。谢谢你的更新。