Извлеките строку из path / dir, используя Make - PullRequest
1 голос
/ 12 февраля 2020

У меня есть Makefile с несколькими git репо, которые мне нужно клонировать. Я использую следующее, которое работает

clone:
    git clone https://github.company.corp/dev-wi/ws-led.git
    git clone https://github.company.corp/dev-wi/tools-extension.git
    git clone https://github.company.corp/dev-wi/javt-ra.git

Хотя следующий код работает, я хочу сделать что-то вроде этого в l oop для всех репозиториев в списке

build:
    cd ws-led;  \
    docker build -t ws-led .
    cd tools-extension;  \
    docker build -t tools-extension .
    ...

Для каждого репо мне нужно изменить dir и запустить сборку docker, я хочу избегать повторения этого снова и снова ... Я знаю, что мне нужно извлечь строку после / dev-wi / , так как это каталог репо, который мне нужен для запуска docker build. так как у меня много репо, как я могу сделать это легко?

Я пытаюсь использовать подмножество, но у меня также есть команда git (в клоне), поэтому она не работает, вы понимаете?

update Я создал Новый make-файл и используйте только этот код (ws-led и tools-extension - это папки того же уровня, что и make-файл

repos := ws-led tools-extension

.PHONY: all

all: $(patsubst%,%/docker-build.log,$(repos))

%/docker-build.log: %/.git
    cd $*; docker build -t $* . >&2 | tee docker-build.log

Я получил ошибку:

make: Nothing to be done for all'.

что мне здесь не хватает?

Я пытаюсь упростить это, но удаляя git и пусть говорят, что папки (репо ) существующий на том же уровне make-файла

UPDATE

Я изменяю make-файл так, чтобы он находился под root

proj
  - ws-led
  — Dockerfile
 -tools-ext
 —Dockerfile    
-Makefile

Я пытаюсь использовать следующее

all: pre docker-build
.PHONY: pre docker-build
repos := ws-led tools-ext

pre:
    $(patsubst %,%docker-build,$(repos))

docker-build:pre
    cd $*; docker build -t $* . >&2 | tee docker-build

, когда я запускаю make, я получаю следующую ошибку

ws-leddocker-build  ws-leddocker-build
make: ws-leddocker-build: No such file or directory

Есть идеи?

1 Ответ

2 голосов
/ 12 февраля 2020

Зацикливание - это вообще то, чего вы хотите избежать. Вместо этого, объявляйте серию целей для каждого репо.

repos := ws-led tools-extension javt-ra

.PHONY: all clone
all: $(patsubst %,%/.built,$(repos))
clone: $(patsubst %,%/.git,$(repos))

%/.built: %/.git
    cd $*; docker build -t $* .
    touch $@

%/.git:
    git clone https://github.company.corp/dev-wi/$*.git

Файл флага .built является чем-то вроде бородавки и может быть с пользой заменен чем-то более полезным, например, выводом из docker build .

all: $(patsubst %,%/docker-build.log,$(repos))

%/docker-build.log: %/.git
    cd $*; docker build -t $* . >&2 | tee docker-build.log

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

Сказав это, $(patsubst ...) - это всего лишь oop своего рода. ; он в основном зацикливается на repos и создает небольшой фрагмент текста вокруг каждого. Без patsubst мы могли бы написать

all: ws-led/.built tools-extension/.built javt-ra/.built

, в котором просто говорится, что для создания all нам нужно сделать эти три; а затем

%/.built: %/.git

говорит, что для всего, что соответствует шаблону, оно зависит от того же стебля с /.git после него. Таким образом, в другом пустом каталоге make обнаружит, что

  • для создания all, нам нужно сделать ws-led/.built, tools-extension/.built и javt-ra/.built;
    • чтобы сделать ws-led/.built, нам нужно сделать ws-led/.git;
      • чтобы сделать ws-led/.git, нам нужно
      git clone https://github.company.corp/dev-wi/ws-led.git
      
      • затем, когда это условие выполнено,
      cd ws-led; docker build -t ws-led .
      touch ws-led/.built
      
    • чтобы сделать tools-extension/.built, нам нужно сделать tools-extension/.git;
      • чтобы сделать tools-extension/.git, нам нужно
      git clone https://github.company.corp/dev-wi/tools-extension.git
      
      ... et c et c.

В будущем, когда make обнаружит, что ws-led новее ws-led/.built, он построит его снова; но если это не так, он придет к выводу, что никакой работы не требуется, и т. д. c для других целей. Так мы избегаем ненужного строительства. но очевидно, что Makefile должным образом содержит формализацию каждой соответствующей зависимости. (В этом случае, в идеале, вы бы хотели, чтобы был способ узнать, когда вышестоящий поток Git изменился и что-то должно быть извлечено локальным Makefile; в настоящее время все просто считается выполненным, если локальный Git клон не получил никаких обновлений.)

...