5

Я имею дело с приложением, которое читает файл конфигурации, config.yml , из текущего каталога. Этот файл конфигурации содержит как секретную информацию (ключи API), которая не должна быть возвращена в систему контроля версий, так и другую информацию о конфигурации, которая может быть.

То, что я хотел бы сделать, это разделить этот файл конфигурации на две части, чтобы получить config.secret.yml и config.public.yml . config.secret.yml будет игнорироваться системой контроля версий , а config.public.yml может быть зарегистрирован.

Затем я хочу как-то создать файл-подобный объект config.yml который эффективно "символизирует" объединенное содержимое config.secret.yml и config.public.yml , чтобы это произошло:

> cat config.secret.yml
---
:api_key: 2712ab206a8003e44b2a84c467fc1b58
>
> cat config.public.yml    
:site_id: 123
>
> cat config.yml
---
:api_key: 2712ab206a8003e44b2a84c467fc1b58
:site_id: 123

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

Файл читается методом Ruby File.read() и анализируется YAML.load() если это предоставляет какую-либо возможность для хитрых хаков.

1 ответ1

3

Вы должны быть в состоянии использовать именованный канал для этого.

Как образец:

echo foo > file1
echo bar > file2

затем создайте новый скрипт в том же каталоге следующим образом:

combine.sh:

#!/bin/bash

[ -p foobar ] && rm foobar

trap "[ -p foobar ] && rm foobar && exit" SIGINT

while [  true ]; do
  mkfifo foobar
  echo "Writing File"
  cat file1 file2 > foobar
  rm foobar
done

затем

chmod +x combine.sh
./combine.sh

Это создаст канал с именем foobar в том же каталоге. Теперь вы можете читать из этого канала из любого процесса, как если бы он был настоящим файлом.

Например, в отдельном терминале:

$ cat foobar
foo
bar

Конечно, вы можете запустить это в фоновом режиме, используя ./combine.sh 2>&1 > /dev/null & или запустить его как службу, если вам нужно больше постоянства.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .