Получение пути к ресурсу в инструменте командной строки

Я пытаюсь получить путь к ресурсу в инструменте командной строки в Xcode (8 бета-версия 2). Вот что у меня есть:

  • Ресурс file.xyz был перенесен в проект, и целевое членство соответствует основному проекту.
  • В разделе «Фазы сборки» -> «Копировать файлы» в качестве места назначения указано «Ресурсы», а подпуть пуст. Флажок «Копировать только при установке» снят, а file.xyz указан в таблице ниже.
  • В моем файле main.swift у меня есть следующий код:

    guard let filePath = Bundle.pathForResource("file",
                                             ofType: "xyz",
                                             inDirectory: "Resources") else{
        fatalError("Could not find file")
    }
    

fatalError срабатывает каждый раз. Любые идеи? Я понимаю, что инструменты командной строки не имеют пакета приложений, и поэтому вместо этого ресурс копируется в папку «Ресурсы», но мой аргумент inDirectory — это немного дикая догадка… Спасибо за чтение.

РЕДАКТИРОВАТЬ: Моя основная цель — получить доступ к файлу ресурсов (в данном случае текстовому файлу) из CLT — я не привязан к этому конкретному способу сделать это, поэтому, если есть альтернативный подход, это тоже здорово!


person Rogare    schedule 17.07.2016    source источник
comment
Поскольку у CLI нет пакета (Bundle.main() это nil!), откуда должна взяться папка Resources или где она должна находиться? Параметр inDirectory указывает допустимую подпапку папки Resources в комплекте.   -  person vadian    schedule 17.07.2016
comment
@vadian Спасибо за комментарий. Я пошел в этом направлении после прочтения комментария capikaw здесь: stackoverflow.com/a/3950218/1781058, где он говорит, что Bundle по-прежнему можно использовать для связывания файлов в целях CLT.   -  person Rogare    schedule 17.07.2016
comment
Вы можете связать файлы для компиляции, вы даже можете вставлять файлы, но вы не можете получить доступ к файлам через (NS)Bundle   -  person vadian    schedule 17.07.2016
comment
@vadian Хорошо, просто чтобы убедиться, что я понимаю, вы говорите, что вообще нет никакого способа получить доступ к файлу ресурсов в инструменте командной строки?   -  person Rogare    schedule 17.07.2016
comment
Я не хочу говорить совсем, но точно не через бандл. Например, можно встроить Info.plist в интерфейс командной строки, но я не знаю, как получить к нему доступ.   -  person vadian    schedule 17.07.2016
comment
@vadian Хорошо, спасибо. Я отредактирую свой вопрос, чтобы было ясно, что меня интересует доступ к файлу ресурсов, но не обязательно использование Bundle.   -  person Rogare    schedule 17.07.2016
comment
Инструменты командной строки делают используют структуру Bundle: другими словами, Bundle.main возвращает допустимый пакет для каталога, содержащего исполняемый файл командной строки. Bundle.main.resourceURL возвращает URL родительского каталога. Bundle.main.pathForResource("file", ofType:"xyz") вернет допустимый путь при условии, что file.xyz скопирован в тот же каталог, что и инструмент командной строки.   -  person NSGod    schedule 17.07.2016
comment
@NSGod Спасибо, получилось! Если вы хотите поместить это в ответ, я отмечу его как принятый.   -  person Rogare    schedule 17.07.2016
comment
@NSGod Мне кажется, что Bundle.main и Bundle.main.resourceURL указывают каталог, содержащий двоичный файл командной строки. Я не уверен, как получить доступ к другим файлам.   -  person Jay Wong    schedule 09.02.2018


Ответы (1)


В качестве обходного пути вы можете использовать абсолютный путь к исходному файлу. Например, если на диске iCloud:

let path = "/Users/myName/Library/Mobile Documents/com~apple~CloudDocs/myDirectory/file.xyz"

person Hugues    schedule 06.02.2020
comment
Я не знаю, почему за это проголосовали. Это работает, если вы программируете для Mac. Вы можете использовать его для проверки импорта тестовых файлов. Вы можете исправить мой пример с реальным абсолютным путем для вашего проекта. Как я уже сказал, просто обходной путь. - person Hugues; 13.10.2020