Скачивайте и перемещайте файл только в том случае, если он не существует в целевом каталоге, в противном случае ничего не делайте - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь установить исполняемую команду (terraform), загрузив zip-файл, а затем распаковать его в каталог ~/bin, используя Makefile.

Я хотел бы сделать это толькоесли файл terraform еще не существует.

В соответствии с GNU Make docs, я думаю, что я должен использовать «предварительное условие только для заказа» с каналом | (https://www.gnu.org/software/make/manual/make.html#Prerequisite-Types), хотя яЯ не совсем понимаю эту документацию.

Я написал следующее целевое правило с целью запустить его как make install-tf, когда файл ~/bin/terraform уже существует, затем ничего не делать и возвращаться.это не работает должным образом, и я продолжаю видеть, как выполняется тело этого целевого правила, независимо от того, файл уже существует.

  • Что не так со следующей целью?
  • Как можноЯ устанавливаю terraform только в том случае, если команда еще не существует с использованием Makefile?

Это цель:

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

1 Ответ

0 голосов
/ 29 января 2019

Что не так со следующей целью?

Цель - install-tf.make install-tf всегда будет запускать рецепт для достижения этой цели, если такого файла как install-tf не существует.Рецепт никогда не создает этот файл.Поэтому рецепт всегда будет запускаться.

Для создания файла $(HOME)/bin/terraform требуется рецепт, если и только если он не существует.В первом приближении это будет сделано:

Makefile (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.

И с небольшим улучшением:

Makefile (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 Ложные цели

...