Если Вы собираетесь сделать вещи тот путь, Вы хотите разделить свою логику и дизайн, верный.
, Но Вы не должны использовать Присяжного острослова, чтобы сделать это.
Приоритет о мышлении. Я видел, что люди делают шокирующие вещи в Присяжном острослове, и это в конечном счете превращается в людей, разрабатывающих сайты в [1 116] Присяжный острослов, и затем некоторый умник решит, что они должны записать, движок шаблонов в Присяжном острослове (Никогда не недооценивают потенциал немой идеи).
, Если Вы повреждаете свой код в две части и вынуждаете себя придерживаться стандарта, тогда Вы получите намного лучшую производительность.
PageLogic.php
<?php
$pageData = (object)(array()); // Handy trick I learnt.
/* Logic Goes here */
$pageData->foo = SomeValue;
ob_start();
require("layout.php");
ob_end_flush();
Layout.php
<html>
<!-- etc -->
<?php for ( $i = 1; $i < 10; $i++ ){ ?>
<?php echo $pageData->foo[$i]; ?>
<?php } ?>
<!-- etc -->
</html>
PHP был записан как механизм шаблонной обработки, таким образом, Вы, по крайней мере, должны попытка для использования его для ее разработанной задачи прежде, чем оценить, необходимо ли копаться в Присяжном острослове.
<час>, Кроме того, если Вы решаете использовать механизм шаблонной обработки, попытка получает тот, который выходит из HTML [1 117] значение по умолчанию , и Вы "отказываетесь" вместо, "подписываются". Вы сохраните себя много головных болей XSS. Присяжный острослов слаб в этом отношении, и из-за этого, существует много довольных-naГЇve шаблоны, записанные в нем.
{if $cond}
{$dangerous_value}
{else}
{$equally_dangerous_value}
{/if}
обычно, как идут шаблоны Присяжного острослова. Проблемой является $dangerous_value, может быть произвольный HTML, и это просто приводит к даже [еще 1118] плохие методы кодирования с непрослеживаемым запутанным кодом везде.
Любой шаблонный язык Вы рассматриваете , должен угождать этому беспокойству. например:
{$code_gets_escaped}
{{$code_gets_escaped_as_a_uri}}
{{{$dangerous_bare_code}}}
Таким образом, Ваши потенциальные дверные проемы для эксплуатации являются легко заметными в шаблоне, в противоположность дверному проему к эксплуатации, являющейся ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ поведение.
Существует два способа создания пакета приложений на MacOSX - легкий и ужасный.
Легкий способ - это просто использовать XCode. Готово.
Проблема в том, что иногда вы не можете этого сделать.
В моем случае я создаю приложение, которое создает другие приложения. Я не могу предположить, что у пользователя установлен XCode. Я также использую MacPorts для сборки библиотек, от которых зависит мое приложение. Мне нужно убедиться, что эти dylibs идут в комплекте с приложением перед его распространением.
Отказ от ответственности: Я совершенно не имею права писать этот пост, все, что в нем написано, было получено от Apple. было почерпнуто из документации Apple, разбор существующих приложений и методом проб и ошибок. Это работает для меня, но, скорее всего, неправильно. Пожалуйста, напишите мне, если у вас есть какие-либо исправления.
Первое, что вы должны знать, это то, что пакет приложений - это просто каталог.
Давайте рассмотрим структуру гипотетического foo.app.
foo.app/ Contents/ Info.plist MacOS/ foo Resources/ foo.icns
Info.plist - это обычный XML-файл. Вы можете редактировать его с помощью текстового редактора или приложения Property List Editor, которое поставляется в комплекте с XCode. (Он находится в каталоге /Developer/Applications/Utilities/).
Основные элементы, которые вам нужно включить:
CFBundleName - название приложения.
CFBundleIcon - файл иконки, который должен находиться в каталоге Contents/Resources. Используйте приложение Icon Composer для создания иконки. (Оно также находится в каталоге /Developer/Applications/Utilities/). Вы можете просто перетащить png в его окно, и оно автоматически сгенерирует для вас mip-уровни.
CFBundleExecutable - Имя исполняемого файла, который предположительно находится в подпапке Contents/MacOS/.
Существует множество других опций, перечисленные выше - лишь необходимый минимум. Вот документация Apple Info.plist файле и Структура пакета приложений.
Кроме того, вот пример Info.plist.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleGetInfoString</key> <string>Foo</string> <key>CFBundleExecutable</key> <string>foo</string> <key>CFBundleIdentifier</key> <string>com.your-company-name.www</string> <key>CFBundleName</key> <string>foo</string> <key>CFBundleIconFile</key> <string>foo.icns</string> <key>CFBundleShortVersionString</key> <string>0.01</string> <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> <key>CFBundlePackageType</key> <string>APPL</string> <key>IFMajorVersion</key> <integer>0</integer> <key>IFMinorVersion</key> <integer>1</integer> </dict> </plist>
В идеальном мире вы могли бы просто бросить свой исполняемый файл в каталог Contents/MacOS/ и готово. Однако, если ваше приложение имеет какие-либо нестандартные зависимости dylib, это не сработает. Как и Windows, MacOS поставляется со своим собственным особым видом DLL Hell.
Если вы используете MacPorts для сборки библиотек, которые вы компонуете, местоположение dylibs будет жестко закодировано в вашем исполняемом файле. Если вы запустите приложение на машине, на которой dylibs находятся в точно таком же месте, оно будет работать нормально. Однако у большинства пользователей они не будут установлены; когда они дважды щелкнут по вашему приложению, оно просто упадет.
Перед распространением исполняемого файла вам нужно будет собрать все загружаемые им dylibs и скопировать их в пакет приложения. Вам также нужно будет отредактировать исполняемый файл так, чтобы он искал dylibs в нужном месте, т.е. там, куда вы их скопировали.
Ручное редактирование исполняемого файла звучит опасно, верно? К счастью, есть инструменты командной строки, которые помогут вам.
otool -L executable_name
Эта команда выведет список всех dylibs, от которых зависит ваше приложение. Если вы увидите те, которые НЕ находятся в папке System/Library или usr/lib, именно их вам нужно скопировать в пакет приложения. Скопируйте их в папку /Contents/MacOS/. Далее вам нужно будет отредактировать исполняемый файл, чтобы он использовал новые dylibs.
Во-первых, вам нужно убедиться, что вы соединяете с использованием флага -headerpad_max_install_names. Это гарантирует, что если путь к новым dylib будет длиннее, чем к предыдущим, для них найдется место.
Во-вторых, используйте инструмент install_name_tool для изменения каждого пути к dylib.
install_name_tool -change existing_path_to_dylib @executable_path/blah.dylib executable_name
В качестве практического примера, допустим, ваше приложение использует libSDL, и otool указывает его расположение как "/opt/local/lib/libSDL-1.2.0.dylib".
Сначала скопируйте его в пакет приложения.
cp /opt/local/lib/libSDL-1.2.0.dylib foo.app/Contents/MacOS/
Затем отредактируйте исполняемый файл, чтобы он использовал новое расположение (ПРИМЕЧАНИЕ: убедитесь, что вы собрали его с флагом -headerpad_max_install_names)
install_name_tool -change /opt/local/lib/libSDL-1.2.0.dylib @executable_path/libSDL-1.2.0.dylib foo.app/Contents/MacOS/foo
Фух, мы почти закончили. Теперь есть небольшая проблема с текущим рабочим каталогом.
Когда вы запускаете ваше приложение, текущей директорией будет директория выше той, в которой находится приложение. Например: Если вы поместите foo.app в папку /Applcations, то текущим каталогом при запуске приложения будет папка /Applications. А не /Applications/foo.app/Contents/MacOS/, как вы могли бы ожидать.
Вы можете изменить свое приложение, чтобы учесть это, или вы можете использовать этот волшебный маленький скрипт запуска, который изменит текущий каталог и запустит ваше приложение.
#!/bin/bash cd "${0%/*}" ./foo
Убедитесь, что вы настроили файл Info.plist так, что CFBundleExecutable указывает на сценарий запуска, а не на предыдущий исполняемый файл.
Хорошо, теперь все готово. К счастью, как только вы узнаете все эти вещи, вы похороните их в сценарии сборки.
Есть несколько инструментов с открытым исходным кодом, которые помогают создавать пакеты приложений с зависимыми библиотеками для конкретных сред, например py2app для приложений на основе Python. Если вы не найдете более общего, возможно, вы сможете адаптировать его к своим потребностям.
Самое простое решение: создайте один раз проект Xcode, ничего не меняя (т.е. сохраните простое однооконное приложение, которое Xcode создает для вас), соберите его и скопируйте пакет, который он создал для вас. Затем отредактируйте файлы (в частности, Info.plist) в соответствии со своим содержанием и поместите свой собственный бинарник в каталог Contents/MacOS/.