gpt4 book ai didi

haskell - 摇一摇: how do I depend on dynamically generated source files?

转载 作者:行者123 更新时间:2023-12-02 17:02:07 25 4
gpt4 key购买 nike

给定这样的目录结构:

.
├── frontend
│   ├── _build/ -- build dir, all files produced by shake, except for Frontend.elm, go here
│   ├── Build.hs -- the build script
│   ├── build.sh -- wrap Build.hs with `stack exec build -- $@`
│   ├── other files ...
│   ├── Frontend.elm -- generated by a rule in Build.hs, `protoc -I../proto --elm_out=. ../proto/frontend.proto`
│   ├── Index.elm -- hand written source file
│   └── other elms ... -- hand written source files
└── proto
   └── frontend.proto -- protocol buffer message defination, hand written

目标_build/index.js依赖于所有.elm文件,包括Frontend.elm,但是 Frontend.elm 是由 Build.hs 中的规则生成的,如果我盲目这样做:

want ["_build/index.js"]
"_build/index.js" %> \out -> do
elms <- filter (not . elmStuff)
<$> (liftIO $ getDirectoryFilesIO "" ["//*.elm"])
need elms
blah blah

want ["Frontend.elm"]
"Frontend.elm" %> \_out -> do
cmd ["protoc", "blah", "blah"]

build.sh clean 会给我:

Lint checking error - value has changed since being depended upon:
Key: Frontend.elm
Old: File {mod=0x608CAAF7,size=0x53D,digest=NEQ}
New: File {mod=0x608CAB5B,size=0x53D,digest=NEQ}

有没有办法告诉 shake 留意动态生成的 Frontend.elm,也许先构建它,这样它在构建的其余部分就不会改变,我尝试过 优先级 100 ("Frontend.elm"%> ...),不起作用。

最佳答案

你可能应该:

  1. 切换自 getDirectoryFilesIO ,它不跟踪文件系统的更改,为 getDirectoryFiles ,确实如此。
  2. 声明您对 Frontend.elm 的依赖,即使文件系统中尚不存在,您也知道您需要它(因此 getDirectoryFiles 可能看不到它)。
  3. (可选)请勿打扰 want ing Frontend.elm ,因为您只想将其作为黑客来启用 _build/index.js .

经过这些更改,它看起来像这样:

want ["_build/index.js"]
"_build/index.js" %> \out -> do
need ["Frontend.elm"]
elms <- filter (not . elmStuff)
<$> getDirectoryFiles "" ["//*.elm"]
need elms
blah blah

"Frontend.elm" %> \_out -> do
cmd ["protoc", "blah", "blah"]

警告讲师:我还没有测试过这个解决方案。

关于haskell - 摇一摇: how do I depend on dynamically generated source files?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45377013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com