makefile - Как присвоить значение переменной по указанному c target? - PullRequest
0 голосов
/ 23 января 2020

В следующем фрагменте кода:

IMAGES_TO_DELETE := $(aws ecr list-images --region $(ECR_REGION) --repository-name $(ECR_REPO) --filter "tagStatus=UNTAGGED" --query 'imageIds[*]' --output json)

.PHONY: target1 target2 cleanimage

cleanimage:
    ${DISPLAYINFO} "Clean untagged image from AWS ECR "
    aws ecr batch-delete-image --region $(ECR_REGION) --repository-name $(ECR_REPO) --image-ids "$(IMAGES_TO_DELETE)" || true
    ${DISPLAYINFO} "Done"

target1:
   # do something

target2:
   # do something

IMAGES_TO_DELETE дает список изображений в формате JSON.

IMAGES_TO_DELETE предполагается назначать, когда make cleanimage выполняет

Как присвоить значения переменной в cleanimage target?

Ответы [ 2 ]

1 голос
/ 24 января 2020

Похоже, у вас все еще непонимание переменных make.

Непонятно, почему это вообще должна быть переменная. Просто вставьте его в цель:

.PHONY: cleanimage

cleanimage:
    ${DISPLAYINFO} "Clean untagged image from AWS ECR "
    aws ecr batch-delete-image --region $(ECR_REGION) --repository-name $(ECR_REPO) \
        --image-ids "$$(aws ecr list-images --region $(ECR_REGION) --repository-name $(ECR_REPO) \
            --filter "tagStatus=UNTAGGED" --query 'imageIds[*]' --output json)" || true
    ${DISPLAYINFO} "Done"

В качестве отступления $(aws...) не является допустимой make функцией; Вы имеете в виду $(shell aws ...); но опять же, нет нужды оценивать это в make вообще, если это необходимо только для одной цели.

Там, где вы повторили информацию, есть смысл преобразовать ее в переменную, чтобы вам нужно только изменить его в одном месте.

ECRFLAGS := --region $(ECR_REGION) --repository-name $(ECR_REPO)

.PHONY: cleanimage

cleanimage:
    ${DISPLAYINFO} "Clean untagged image from AWS ECR "
    aws ecr batch-delete-image $(ECRFLAGS) \
        --image-ids "$$(aws ecr list-images $(ECRFLAGS) \
            --filter "tagStatus=UNTAGGED" --query 'imageIds[*]' --output json)" || true
    ${DISPLAYINFO} "Done"

Помните, один знак доллара оценивается make. Если вы хотите пропустить через оболочку буквальный знак доллара, вам нужно его удвоить.

0 голосов
/ 23 января 2020

Сделать переменные должны всегда окруженными скобками или скобками. Если нет, то только следующий символ является частью переменной.

Поэтому, когда вы пишете $ECR_REGION, make расширит переменную $E (которая, вероятно, пуста), а затем добавит строку CR_REGION. Не то, что вы хотите.

Вы должны написать $(ECR_REGION) (или ${ECR_REGION}, если вы предпочитаете: они эквивалентны сделать).

То же самое для $(ECR_REPO) и $(IMAGES_TO_DELETE).

См. https://www.gnu.org/software/make/manual/html_node/Reference.html

...