Конкретная помощь с шаблоном проекта Xcode, который не выполняет замену в содержимом файла

Мы пытаемся сделать шаблон проекта, но документация по этому поводу неполная или отсутствует.

Выполняя обратный инжиниринг некоторых файлов шаблонов, мы пришли к следующему. Однако на самом деле это не работает!

Во-первых, мы разобрались, что внутри должны быть установлены шаблоны проектов:

~/Библиотека/Поддержка приложений/Разработчик/Общие/Xcode/Шаблоны проектов

Мы создали проект и установили его здесь, и эта часть работает — мы видим, что это отображается в разделе «Пользовательские шаблоны» в меню выбора Xcode «Новый проект».

Папка проекта содержит следующие файлы. Как видите, я хочу, чтобы имена файлов были заменены (эта часть работает), но, как вы увидите, я также хочу, чтобы содержимое файлов было заменено; этого не происходит.

  • ___PROJECTNAME___.xcodeproj
  • ___PROJECTNAMEASIDENTIFIER____Prefix.pch
  • ___PROJECTNAMEASIDENTIFIER___.icns
  • ___PROJECTNAMEASIDENTIFIER___Delegate.h
  • ___PROJECTNAMEASIDENTIFIER___Delegate.m
  • ___PROJECTNAMEASIDENTIFIER___Template.html
  • Debug.xcconfig
  • en.lproj
  • Информация.plist
  • Release.xcconfig

Я поместил в пакет ___PROJECTNAME___.xcodeproj два специальных файла:

  • TemplateInfo.plist
  • TemplateIcon.icns — значок, отображаемый в окне «Новый проект».

Если я создам новый проект (названный «Foo & Bar» в качестве стресс-теста) с использованием этого шаблона, он создаст следующие файлы:

  • Debug.xcconfig
  • en.lproj
  • Фу и Бар.xcodeproj
  • Foo___Bar_Prefix.pch
  • Foo___Bar.icns
  • Foo___BarDelegate.h
  • Foo___BarDelegate.m
  • Foo___BarTemplate.html
  • Информация.plist
  • Release.xcconfig

Все идет нормально!

Но глядя на содержимое файла, я получаю такие вещи. Вот содержимое Foo___BarDelegate.m:

//
//  «PROJECTNAMEASIDENTIFIER»Delegate.m
//  «PROJECTNAME»
//
//  Created by «FULLUSERNAME» on «DATE».
//  Copyright «ORGANIZATIONNAME» «YEAR» . All rights reserved.
//

#import "«PROJECTNAMEASIDENTIFIER»Delegate.h"


@implementation «PROJECTNAMEASIDENTIFIER»Delegate

@end

Очевидная проблема заключается в том, что я почему-то неправильно делаю TemplateInfo.plist. Но опять же, обратите внимание, что не только мои специальные предметы не заменяются, но даже стандартные предметы не заменяются! Так что, возможно, это более глубокая проблема.

Но так как проблемный TemplateInfo.plist является моей лучшей гипотезой, я представляю пару вариантов, которые я пробовал. Ни работы.

Либо:

{
    FilesToMacroExpand = (
        "\_\_\_PROJECTNAMEASIDENTIFIER\_\_\_\_Prefix.pch",
        "en.lproj/InfoPlist.strings",
        "\_\_\_PROJECTNAMEASIDENTIFIER\_\_\_\_Prefix.pch",
        "\_\_\_PROJECTNAMEASIDENTIFIER\_\_\_.icns",
        "\_\_\_PROJECTNAMEASIDENTIFIER\_\_\_Delegate.h",
        "\_\_\_PROJECTNAMEASIDENTIFIER\_\_\_Delegate.m",
        "\_\_\_PROJECTNAMEASIDENTIFIER\_\_\_Template.html",
        "Info.plist"
    );
    Description = "This project builds a cocoa-based \"element\" plugin for Sandvox.";
}

or:

{
    FilesToMacroExpand = (
        "«PROJECTNAMEASIDENTIFIER»\_Prefix.pch",
        "en.lproj/InfoPlist.strings",
        "«PROJECTNAMEASIDENTIFIER»\_Prefix.pch",
        "«PROJECTNAMEASIDENTIFIER».icns",
        "«PROJECTNAMEASIDENTIFIER»Delegate.h",
        "«PROJECTNAMEASIDENTIFIER»Delegate.m",
        "«PROJECTNAMEASIDENTIFIER»Template.html",
        "Info.plist"
    );
    Description = "This project builds a cocoa-based \"element\" plugin for Sandvox.";
}

Обновление: я также попытался добавить ключ «FilesToRename», хотя ___, похоже, автоматически вызывает переименование. Это содержимое plist с этим в формате XML (поскольку некоторые люди беспокоились об этой природе вещей UTF-8 - да, это действительный plist):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Description</key>
    <string>This project builds a cocoa-based "element" plugin for Sandvox.</string>
    <key>FilesToMacroExpand</key>
    <array>
        <string>«PROJECTNAMEASIDENTIFIER»_Prefix.pch</string>
        <string>en.lproj/InfoPlist.strings</string>
        <string>«PROJECTNAMEASIDENTIFIER».icns</string>
        <string>«PROJECTNAMEASIDENTIFIER»Delegate.h</string>
        <string>«PROJECTNAMEASIDENTIFIER»Delegate.m</string>
        <string>«PROJECTNAMEASIDENTIFIER»Template.html</string>
        <string>Info.plist</string>
    </array>
    <key>FilesToRename</key>
    <dict>
        <key>___PROJECTNAMEASIDENTIFIER___.icns</key>
        <string>«PROJECTNAMEASIDENTIFIER».icns</string>
        <key>___PROJECTNAMEASIDENTIFIER___Delegate.h</key>
        <string>«PROJECTNAMEASIDENTIFIER»Delegate.h</string>
        <key>___PROJECTNAMEASIDENTIFIER___Delegate.m</key>
        <string>«PROJECTNAMEASIDENTIFIER»Delegate.m</string>
        <key>___PROJECTNAMEASIDENTIFIER___Template.html</key>
        <string>«PROJECTNAMEASIDENTIFIER»Template.html</string>
        <key>___PROJECTNAMEASIDENTIFIER____Prefix.pch</key>
        <string>«PROJECTNAMEASIDENTIFIER»_Prefix.pch</string>
        <key>___PROJECTNAME___.xcodeproj</key>
        <string>«PROJECTNAME».xcodeproj</string>
    </dict>
</dict>
</plist>

person danwood    schedule 06.10.2008    source источник
comment
Дэнвуд, пожалуйста, добавляйте любые свои будущие советы по этому вопросу, поскольку вы продолжаете их открывать. Ваша публикация этого вопроса вдохновила меня попробовать это самому, и я хотел бы услышать, что вы, наконец, сделаете, когда все это заработает.   -  person pestophagous    schedule 07.10.2008


Ответы (6)


Вероятно, вы захотите использовать раздел «FilesToRename». Следующее взято из шаблона приложения на основе документа PyObjC Cocoa. Это работает нормально.

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Description</key>
        <string>This project builds a Cocoa-based application written in Python that uses the NSDocument architecture.</string>
        <key>FilesToMacroExpand</key>
        <array>
                <string>«PROJECTNAME»_Prefix.pch</string>
                <string>Info.plist</string>
                <string>English.lproj/InfoPlist.strings</string>
                <string>English.lproj/MainMenu.xib</string>
                <string>English.lproj/«PROJECTNAMEASIDENTIFIER»Document.xib</string>
                <string>main.py</string>
                <string>«PROJECTNAMEASIDENTIFIER»Document.py</string>
                <string>main.m</string>
        </array>
        <key>FilesToRename</key>
        <dict>
                <key>CocoaAppDocument.py</key>
                <string>«PROJECTNAMEASIDENTIFIER»Document.py</string>
                <key>CocoaDocApp_Prefix.pch</key>
                <string>«PROJECTNAMEASIDENTIFIER»_Prefix.pch</string>
                <key>English.lproj/CocoaAppDocument.xib</key>
                <string>English.lproj/«PROJECTNAMEASIDENTIFIER»Document.xib</string>
        </dict>
</dict>
</plist>
person bbum    schedule 06.10.2008
comment
Мои файлы, кажется, автоматически переименовываются; Я думаю, что содержимое внутри не обрабатывается. - person danwood; 07.10.2008

Другой ресурс — это XcodeTemplateFactory Джесси Грожана. Это бесплатно и с открытым исходным кодом и может избавить вас от головной боли в будущем.

person rentzsch    schedule 06.10.2008
comment
Ссылка, кажется, битая. Проект найден по адресу groups.google.com/group/hogbaysoftware/. browse_thread/поток/ - person Buzzy; 01.01.2012

В дополнение к ответу Криса ("Есть два стиля шаблонов...") вы можете найти примеры нового стиля в шаблонах для другой платформы...

В следующем отрывке показаны примеры нескольких типичных переменных подстановки с использованием тройных подчеркиваний; если вы используете их вместо переменных на основе guillamot в вашем Foo___BarDelegate.m, это должно работать.

//
//  ___PROJECTNAMEASIDENTIFIER___AppDelegate.m
//  ___PROJECTNAME___
//
//  Created by ___FULLUSERNAME___ on ___DATE___.
//  Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved.
//

#import "___PROJECTNAMEASIDENTIFIER___AppDelegate.h"

@implementation ___PROJECTNAMEASIDENTIFIER___AppDelegate
person mmalc    schedule 08.10.2008

Существует два стиля шаблонов, отличающихся разделителями макросов шаблона: в старом стиле используются кайры MacRoman в файле UTF-8, а в новом стиле повсюду используются тройные подчеркивания. Вы не можете смешивать и сочетать. Новый стиль предназначен только для 3.1 и более поздних версий, и вы также должны использовать тройные подчеркивания в именах файлов, которые нужно заменить.

person cdespinosa    schedule 07.10.2008

Я просто ломал голову над той же проблемой!

Для меня добавление файлов в plist работает, я заменил html-файл на php-файл, и он анализируется. Но теперь он анализирует только несколько первых элементов из списка. Старый html-файл по-прежнему: «PROJECTNAME». Вроде эта программа не считает, сколько элементов в списке...

Но где место в коде, где это не делается...?

person Community    schedule 24.09.2009

Почему вам не хватает этих символов «‹‹»? Вот почему xcode не распознает и не заменяет теги шаблонов.

person Puneet Madaan    schedule 24.09.2009