Пройдите путь к "."источник в make-файле - PullRequest
0 голосов
/ 16 октября 2019

В каталоге у меня есть файл конфигурации с моими переменными в БД.

Этот файл (db/database.ini) выглядит следующим образом:

[PostgreSQL]
host=localhost
database=...
user=postgres 
password=...

У меня есть другой файл (db/create_stmts.sql), где у меня есть все мои необработанные операторы создания таблиц, и я пытаюсьпоэкспериментируйте с использованием Makefile, чтобы иметь такую ​​команду:

make create-db from_file=db/create_stmts.sql

Чтобы не повторяться, я подумал о tail передаче переменных db/database.ini вфайл, который я затем поставлю, создав переменные оболочки для передачи psql в файле make.

Вот мой план:

make-db:

        # from_file: path to .sql file with all create statements to create the database where to insert
        # how to run: make create-db from_file={insert path to sql file}

        file_path=$(PWD)/file.sh
        tail -n4 db/database.ini  > file.sh && . $(file_path)

        # -U: --user
        # -d: --database
        # -q: --quiet
        # -f: --file
        psql -U $(user) -d $(database) -q -f $(from_file) && rm file.sh

, которым я управляю: make create-db from_file=db/create_stmts.sql

Который дает мне это сообщение - из которого я вроде понимаю, что источник просто не сделалработа.

#from_file: path to .sql file with all create statements to create the database where to insert
# how to run: make create-db from_file={insert path to sql file}    
file_path=/home/gabriele/Desktop/TIUK/companies-house/file.sh
tail -n4 db/database.ini  > file.sh && .    
# -U: --user
# -d: --database
# -q: --quiet
# -f: --file
psql -U  -d  -q -f db/schema_tables.sql && rm file.sh
psql: FATAL:  Peer authentication failed for user "-d"
Makefile:3: recipe for target 'create-db' failed
make: *** [create-db] Error 2

Любая помощь?

Ответы [ 3 ]

1 голос
/ 16 октября 2019

Другое решение, возможно, более простое для понимания:

make-db:
        file_path=$$PWD/file.sh; \
        tail -n4 db/database.ini  > file.sh && . $$file_path; \
        psql -U $$user -d $$database -q -f $$from_file && rm file.sh

Обратите внимание на использование ; и \, чтобы убедить make выполнить все команды в одной оболочке, и использование $$ для выхода из $ и использовать ссылки на переменные оболочки.

1 голос
/ 17 октября 2019

Я бы сделал его более удобным, используя функцию автоматической генерации Makefile. Учитывая, что файл конфигурации является простым файлом свойств, его синтаксис легко разбирается с помощью Make, достаточно просто получить строки с переменными, например:

include database.mk

database.mk: db/database.ini
        grep -E '^\w+=\w+$$' $< > $@

.PHONY: create-db
create-db: $(from_file)
        psql -U $(user) -d $(database) -q -f $<

Некоторые дополнительные примечания:

  • create-db следует сделать .PHONY, чтобы избежать ситуации, когда ничего не делается из-за того, что кто-то создал (случайно или нет) файл с именем create-db,
  • , сделав create-db в зависимости от from_file из make можно получить чистую и читаемую ошибку о том, что файл не существует вместо возможной загадочной ошибки позже.
1 голос
/ 16 октября 2019

Ошибка в тексте, а именно

psql -U  -d  -q -f db/schema_tables.sql && rm file.sh

Это происходит потому, что переменные $(user) и $(database) не установлены. Каждая строка в пределах цели выполняется в вложенной оболочке. Теперь есть способ использовать source, как в обычном скрипте.

Вы можете создать файл с именем database.mk, в котором вы определяете эти переменные и используете include database.mk в верхней части вашего make-файла, чтобывключите их:

Makefile

CONFILE ?= database
include $(CONFILE).mk

test:
        @echo $(user)
        @echo $(database)

database.mk

user     := user
database := data

Если вы хотите проанализировать INIфайл, который вы могли бы сделать это как таковой

CONFILE := db/database.ini

make-db: _setup_con
        echo $(user) $(database)
        # your target

_setup_con:
        $(eval user=$(shell grep "user=" $(CONFILE) | grep -Eo "[^=]*$$"))
        $(eval database=$(shell grep "database=" $(CONFILE) | grep -Eo "[^=]*$$"))
        # and so forward

...