Продажа собственного инструмента при сохранении максимальной мобильности
Манифест приложения из двенадцати факторов гласит, что именно для веб-приложений "... имеется четкий контракт с базовой операционной системой, обеспечивающий максимальную переносимость между средами исполнения" [выделено мной]
Но тогда это говорит:
Двенадцатифакторные приложения также не полагаются на неявное существование каких-либо системных инструментов. Примеры включают обстрел
ImageMagick
или жеcurl
, Хотя эти инструменты могут существовать во многих или даже в большинстве систем, нет гарантии, что они будут существовать во всех системах, где приложение может работать в будущем, или будет ли версия, найденная в будущей системе, совместима с приложением. Если приложение необходимо выложить на системный инструмент, этот инструмент должен быть добавлен в приложение.
и они ранее определили "продаваться в приложение" как:
попадает в каталог, содержащий приложение (известное как "vendoring" или "bundling").
Как это сделать, если (по крайней мере, в Linux) собственные 64-разрядные исполняемые файлы не работают, например, в 32-разрядных средах, не говоря уже о других операционных системах? Или есть лучший способ справиться с этой проблемой переносимости?
2 ответа
На мой взгляд, это не должно быть сделано вообще. Это потому что:
- Если собственные исполняемые файлы динамически связаны, есть вероятность, что они не смогут работать только в будущих выпусках ОС, не говоря уже о будущих или прошлых процессорных архитектурах.
- Насколько я понимаю, невозможно полностью обеспечить будущее исполнение собственного исполняемого файла, статически связав его. У вас все еще могут быть проблемы. Solaris даже не поддерживает статическое связывание системных библиотек!
- Библиотечные зависимости - не единственный вид зависимостей, которые могут иметь нативные инструменты. Могут быть и другие проблемы.
- старый
ImageMagick
с - или дажеcurl
s - могут иметь ошибки безопасности, которые могут позволить вашему приложению быть скомпрометированным. (Это немного спорный момент - его достоверность зависит от того, кому вы доверяете больше, чтобы наблюдать / применять обновления безопасности - людей, которые обслуживают и обновляют серверы, или разработчиков? Конечно, они могут быть теми же людьми - пока Но мое рабочее предположение здесь заключается в том, что со временем на серверах будут применяться обновления, что, в свою очередь, защитит ваше приложение от дыр в безопасности системных исполняемых файлов, которые были исправлены в обновлениях.)
Мое мнение: Если выбранная вами система управления зависимостями просто не может обрабатывать собственные исполняемые файлы, вставьте заметку в README и покончите с этим. Если у вас нет README, создайте его. И (для внутренних веб-приложений) добавьте собственные инструменты, которые вам нужны, к стандартному образу сервера или сценарию, который вы используете при настройке сервера, и убедитесь, что вы храните дополнительную информацию о том, почему они есть.
Это просто означает, что у вас должна быть декларативная зависимость и четкий контракт между вашими поставщиками ресурсов.
Если ваше приложение использует определенную версию программного обеспечения, вы должны заключить с ним чистый контракт, чтобы вы могли смоделировать / заглушить функциональность для разработки. Кроме того, включение управления зависимостями в ваше приложение не является невозможным даже в Windows (хотя вы можете захотеть, чтобы это происходило в вашем установщике, а не в самом приложении).
Если ваш продукт настолько сильно зависит от другого программного обеспечения, что он не может функционировать без него даже в тестовой среде, то его нужно объединить, и вам придется разработать лицензионное соглашение, или, на самом деле, у вас нет продукта.