停止使用makefile(改用TaskFile)
#生产率 #tooling #go #learning

介绍

gnu制造起源于依赖性跟踪构建工具,可自动化源文件和库的构建过程。尽管许多现代语言都提供内置的依赖性管理和构建工具,但Makefile仍然在这些项目中找到了它的位置。在这些情况下,MakeFiles用作测试,构建和棉绒等动作的别名集合。在本文中,我将向您展示这些用例有更好的选择:koude0

但是,制作是标准练习!

是的,Make在近50年的时间里一直在不断开发,从而带来了一系列强大的功能和丰富的软件工程历史。它可能会永远存在,但是这些深根是相同的东西,阻止它变得易于友好和直观。

  • makefiles通常会因许多环境变量,宏和特殊符号而变得混乱
  • 您必须使用标签(ugh)
  • 如果不使用环境变量,您将无法通过参数
  • makefiles中令人讨厌的惯例是将许多环境变量串在一起构建命令
  • 当使用非文件目标作为命令别名
  • 时,需要.PHONY
  • 许多功能都是围绕构建文件而设计的,这些功能通常在这些现代场景中无关紧要

当我们不将其用于构建和设计核心功能时,我们必须问自己是否有其他选择。

任务简介

这是任务文件所在的地方。YAML格式创建一个自我记录的文件,该文件说明每个“任务”的行为方式。
与makefile相比,冗长的格式是一个受欢迎的功能,将导致更平易近人的文件。当集成到开源项目中时,它可以使新贡献者更容易开始。

遵循simple install process后,您只需要运行task --init即可创建一个简单的示例文件。此示例显示了如何使用环境变量并执行命令。

version: '3'

vars:
  GREETING: Hello, World!

tasks:
  default:
    cmds:
      - echo "{{.GREETING}}"
    silent: true

在这一点上,您拥有涵盖基本用例所需的所有信息。我鼓励您检查official documentation,而不是在这里提供教程。编写良好的指南首先将基础知识与具体示例和毕业生一起显示为更复杂的功能。与Make.

提供的大型平原HTML页面相比,这是一个受欢迎的景象。

重写Makefile到TaskFile

我最近阅读了Ramseyjiang的Guide to using Makefile with Go。这是一本有趣的阅读,并在为通用任务和构建提供一致的界面方面提出了很好的观点。它让我思考如何通过使用任务文件如何进一步改善开发人员体验。

这是本文作者创建的示例makefile:

APP_NAME = myapp
GO_FILES = $(wildcard *.go)
GO_CMD = go
GO_BUILD = $(GO_CMD) build
GO_TEST = $(GO_CMD) test

all: build

executable
build: $(APP_NAME)

$(APP_NAME): $(GO_FILES)
   $(GO_BUILD) -o $(APP_NAME) $(GO_FILES)

test:
   $(GO_TEST) -v ./... -cover

.PHONY: all build test

这是我转换为TaskFile:

version: "3"

vars:
  APP_NAME: myapp

tasks:
  default:
    cmds:
      - task: build

  build:
    cmds:
      - go build -o {{.APP_NAME}} *.go
    sources:
      - "*.go"
    generates:
      - "{{.APP_NAME}}"

  test:
    cmds:
      - go test -v ./... -cover

如果您在计数行,您可能会注意到TaskFile还有更多。可以通过将cmd与字符串代替cmds和数组来均衡,但是我的优先级是创建一些易于阅读和构建的东西。

任务功能

任务涵盖了制造的所有主要特征:

  • 智能跟踪输入/输出文件以跳过不必要的构建
  • 任务或目标之间的依赖性
  • 包括其他文件
  • 访问环境变量

此外,这是我最喜欢的一些任务功能:

  • 自动CLI使用输出和自动完成
  • 并行运行多个任务。我用这个命令
  • 使用此操作来启动前端服务和npm run dev
  • 对输出语法的控制,可用于分组CI环境中的输出
  • 向任务命令进行远程CLI参数。我用它来运行task up -d,该task up -d将以独立模式启动docker容器
  • 全局任务文件:task将走上文件系统树,直到找到任务文件,或使用-g/--global搜索您的主目录

我喜欢在我的全局任务文件中添加docs任务,该任务将在我的默认浏览器中打开使用指南:

version: '3'

tasks:
  docs:
    cmd: open https://taskfile.dev/usage/

结论

尽管我在这里争辩说,对于许多现代项目而言,任务文件比制造商要好,但我并不是说TaskFile在所有情况下都可以替代Makefile。这两个工具具有很多重叠,但最终是为不同用例设计的。总会有一个制造件的地方,但是您的现代项目可能会更好地使用任务费用。我希望您的下一步是installation docs进行任务,以便您尝试一下!

链接