仅当目标目录中不存在文件时才下载并移动文件,否则不执行任何操作



我正在尝试通过下载zip文件来安装可执行命令(terraform),然后使用Makefile将其解压缩到~/bin目录中。

仅当terraform文件尚不存在时,我才想这样做。

根据 GNU Make 文档,我认为我应该使用带有管道| (https://www.gnu.org/software/make/manual/make.html#Prerequisite-Types) 的"仅订单先决条件",尽管我不完全理解该文档。

我编写了以下目标规则,目的是make install-tf运行它,当文件已经存在时~/bin/terraform,然后什么都不做并返回。但是,这并没有按预期工作,无论文件已经存在,我都不断看到该目标规则的正文正在执行。

  • 以下目标有什么问题?
  • 如何仅当
  • 该命令尚未使用Makefile时才安装terraform

这是目标:

TERRAFORM_VERSION=0.11.11
install-tf: | ~/bin/terraform
    echo "Installing terraform version ${TERRAFORM_VERSION}"
    mkdir -p ~/tmp/
    wget https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip -P ~/tmp/
    mkdir -p ~/bin/
    unzip ~/tmp/terraform_${TERRAFORM_VERSION}_linux_amd64.zip -d ~/bin/
    echo "Done installing terraform version ${TERRAFORM_VERSION}"
    PATH=~/bin/:$$PATH terraform --version

以下目标有什么问题?

目标是 install-tf . make install-tf将始终运行配方来制作这个目标(如果不存在install-tf这样的文件)。配方永远不会创建该文件。因此,配方将始终运行。

您需要一个配方才能使文件$(HOME)/bin/terraform当且仅当不存在。对于第一个近似值,这将做到这一点:

制作文件 (1)

TERRAFORM_VERSION=0.11.11
$(HOME)/bin/terraform:
    echo "Installing terraform version ${TERRAFORM_VERSION}"
    mkdir -p $(HOME)/tmp/
    wget https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip -P $(HOME)/tmp/
    mkdir -p $(HOME)/bin/
    unzip ~/tmp/terraform_${TERRAFORM_VERSION}_linux_amd64.zip -d $(HOME)/bin/
    echo "Done installing terraform version ${TERRAFORM_VERSION}"
    PATH=$(HOME)/bin/:$$PATH terraform --version

第一次运行,如下所示:

$ make
echo "Installing terraform version 0.11.11"
Installing terraform version 0.11.11
mkdir -p /home/imk/tmp/
wget https://releases.hashicorp.com/terraform/0.11.11/terraform_0.11.11_linux_amd64.zip -P /home/imk/tmp/
--2019-01-29 11:09:11--  https://releases.hashicorp.com/terraform/0.11.11/terraform_0.11.11_linux_amd64.zip
Resolving releases.hashicorp.com (releases.hashicorp.com)... 151.101.17.183, 2a04:4e42:4::439
Connecting to releases.hashicorp.com (releases.hashicorp.com)|151.101.17.183|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 20971661 (20M) [application/zip]
Saving to: ‘/home/imk/tmp/terraform_0.11.11_linux_amd64.zip’
terraform_0.11.11_l 100%[===================>]  20.00M  8.86MB/s    in 2.3s
2019-01-29 11:09:14 (8.86 MB/s) - ‘/home/imk/tmp/terraform_0.11.11_linux_amd64.zip’ saved [20971661/20971661]
mkdir -p /home/imk/bin/
unzip ~/tmp/terraform_0.11.11_linux_amd64.zip -d /home/imk/bin/
Archive:  /home/imk/tmp/terraform_0.11.11_linux_amd64.zip
  inflating: /home/imk/bin/terraform
echo "Done installing terraform version 0.11.11"
Done installing terraform version 0.11.11
PATH=/home/imk/bin/:$PATH terraform --version
Terraform v0.11.11

第二次喜欢:

$ make
make: '/home/imk/bin/terraform' is up to date.

并稍作改进:

制作文件 (2)

TERRAFORM_VERSION := 0.11.11
.PHONY: all clean
all: $(HOME)/bin/terraform
$(HOME)/bin/terraform: | $(HOME)/tmp/ $(HOME)/bin/
    echo "Installing terraform version ${TERRAFORM_VERSION}"
    wget https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip -P $(HOME)/tmp/
    unzip ~/tmp/terraform_${TERRAFORM_VERSION}_linux_amd64.zip -d $(HOME)/bin/
    echo "Done installing terraform version ${TERRAFORM_VERSION}"
    PATH=$(HOME)/bin/:$$PATH terraform --version
$(HOME)/tmp/ $(HOME)/bin/:
    mkdir -p $@
clean:
    $(RM) $(HOME)/bin/terraform

运行如下:

$ make clean
rm -f /home/imk/bin/terraform
$ make
echo "Installing terraform version 0.11.11"
Installing terraform version 0.11.11
wget https://releases.hashicorp.com/terraform/0.11.11/terraform_0.11.11_linux_amd64.zip -P /home/imk/tmp/
--2019-01-29 11:38:32--  https://releases.hashicorp.com/terraform/0.11.11/terraform_0.11.11_linux_amd64.zip
Resolving releases.hashicorp.com (releases.hashicorp.com)... 151.101.17.183, 2a04:4e42:4::439
Connecting to releases.hashicorp.com (releases.hashicorp.com)|151.101.17.183|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 20971661 (20M) [application/zip]
Saving to: ‘/home/imk/tmp/terraform_0.11.11_linux_amd64.zip.1’
terraform_0.11.11_l 100%[===================>]  20.00M  8.88MB/s    in 2.3s    
2019-01-29 11:38:34 (8.88 MB/s) - ‘/home/imk/tmp/terraform_0.11.11_linux_amd64.zip.1’ saved [20971661/20971661]
unzip ~/tmp/terraform_0.11.11_linux_amd64.zip -d /home/imk/bin/
Archive:  /home/imk/tmp/terraform_0.11.11_linux_amd64.zip
  inflating: /home/imk/bin/terraform  
echo "Done installing terraform version 0.11.11"
Done installing terraform version 0.11.11
PATH=/home/imk/bin/:$PATH terraform --version
Terraform v0.11.11
$ make
make: Nothing to be done for 'all'.

请注意在以下情况下使用仅订单先决条件:

$(HOME)/bin/terraform: | $(HOME)/tmp/ $(HOME)/bin/

也就是说:在考虑目标$(HOME)/bin/terraform是否过时之前,请先$(HOME)/tmp/$(HOME)/bin。然后考虑$(HOME)/bin/terraform是否过期,但不$(HOME)/tmp/$(HOME)/bin作为先决条件。

参见 4.6 虚假目标

最新更新