仅当目标目录中不存在文件时才下载并移动文件,否则不执行任何操作
Download and move file only if it does not exist on destination directory, otherwise do nothing
我正在尝试通过下载 zip 文件来安装可执行命令 (terraform
),然后使用 Makefile
.
将其解压缩到 ~/bin
目录
只有 terraform
文件不存在时,我才想这样做。
根据 GNU Make 文档,我认为我应该使用带有管道 |
(https://www.gnu.org/software/make/manual/make.html#Prerequisite-Types) 的 "order-only prerequisite",尽管我并不完全理解该文档。
我写了下面的目标规则,目的是 运行 它作为 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
What's wrong with the following target?
目标是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
算作前提条件。
我正在尝试通过下载 zip 文件来安装可执行命令 (terraform
),然后使用 Makefile
.
~/bin
目录
只有 terraform
文件不存在时,我才想这样做。
根据 GNU Make 文档,我认为我应该使用带有管道 |
(https://www.gnu.org/software/make/manual/make.html#Prerequisite-Types) 的 "order-only prerequisite",尽管我并不完全理解该文档。
我写了下面的目标规则,目的是 运行 它作为 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
What's wrong with the following target?
目标是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
算作前提条件。