我有一个多根工作区,其中包含多个项目。每个项目都有自己的构建任务,调用外部脚本来进行构建。一个项目要求在构建它之前构建所有其他项目,因为需要链接到它们。从现在起我将其称为“应用程序”项目。
我尝试在应用程序的tasks.json构建配置中使用dependsOn,但是如果指定了命令,则引用外部构建任务的名称不起作用,如果未指定命令,则会引发错误。例如:
{
"label": "build-app",
"group": "build",
"dependsOn": [
"devices"
"app",
],
"dependsOrder": "sequence",
"problemMatcher": []
}
Run Code Online (Sandbox Code Playgroud)
即使任务“devices”确实存在并且在devices/tasks.json
文件中工作,也会出现此错误:
Couldn't resolve dependent task 'devices' in workspace folder 'file:///home/simon/git-repos/workspace/app'
Run Code Online (Sandbox Code Playgroud)
现在这表明它不会在当前工作区文件夹之外进行搜索,因此我尝试在 .code-workspace 文件中创建顶级“工作区”任务并引用其中的构建任务:
{
"label": "build-app",
"group": "build",
"dependsOn": [
"devices"
"app",
],
"dependsOrder": "sequence",
"problemMatcher": []
}
Run Code Online (Sandbox Code Playgroud)
这会导致类似的错误:
Couldn't resolve dependent task 'devices' in workspace folder 'file:///home/simon/git-repos/workspace/app.code-workspace'
Couldn't resolve dependent task 'app' in workspace folder 'file:///home/simon/git-repos/workspace/app.code-workspace'
Run Code Online (Sandbox Code Playgroud)
现在看起来它没有在 .code-workspace 文件之外搜索。
我可以通过一些技巧让它按照我想要的方式工作,但我必须将文件app/tasks.json
更改目录中的所有任务指定为依赖项项目,并为每个任务指定问题匹配器“相对路径”。例如:
{
"type": "shell",
"label": "devices",
"command": "cd ${workspaceFolder}/../devices …
Run Code Online (Sandbox Code Playgroud) 在我的脚本中,我试图从多个串行端口读取数据以协调多个设备。
我可以使用exec 9</dev/ttyACM0 && exec 8</dev/ttyACM1
等将文件描述符打开到串行端口。
我在跳,然后我可以select()
对这些文件描述符执行类似的操作以等待数据到达,然后使用read 0<&9
或read 0<&8
取决于接收到的数据来处理它。不幸的是,我找不到select()
Bash的等价物。
我能找到的最接近的是read -t 0 0<&9
用来轮询要读取的数据。我不喜欢这个,因为它需要一个sleep
来防止脚本消耗 100% 的处理器。虽然亚秒级睡眠是可能的,例如while true; do sleep 0.01; done
这会消耗我系统上大约 4% 的处理器。我可以将它回退到 0.1 秒并将其减少到 <1%,但它仍然“感觉”不是正确的方法,因为它为设备之间的任何协调增加了至少 100 毫秒的额外延迟。
有什么解决办法吗?是否有 Bash select() 等价物?