|
6 | 6 |
|
7 | 7 | Создадим пустой каталог и откроем его в VS Code с помощью меню File -> Open Folder. Этот режим открывает папку, как каталог проекта. Это основной режим разработки проектов для 1Скрипт. В нем мы работаем с содержимым папки, как с единым проектом. |
8 | 8 |
|
| 9 | +### Организация корневого каталога репозитория |
| 10 | + |
9 | 11 | Далее, стоит определиться со структурой каталогов. Рекомендуется следующий подход: |
10 | 12 |
|
11 | | -* Корень репозитория не содержит собственно кода и служэ |
| 13 | +* Корень репозитория не содержит собственно кода и служит контейнером для всех ресурсов, связанных с проектом: кода, тестов, документации, вспомогательных инструментов |
| 14 | +* Код проекта, рекомендуется размещать в подпапке src. Содержимое этой папки должно быть удобно отправлять на запуск или сборку и упаковку в дистрибутив. Желательно, чтобы в ней не было ничего лишнего, что в дистрибутив попадать не должно. |
| 15 | +* Тесты проекта рекомендуется размещать в папке tests |
| 16 | +* В папке tasks рекомендуется размещать служебные скрипты, которые помогают разработчику: запускают тесты, собирают дистрибутив, еще что-то. |
| 17 | + |
| 18 | +Также в корне проекта рекомендуется размещать манифест пакета, по которому собирается дистрибутив и [отправляется в хаб пакетов](/learn/libraries) |
| 19 | + |
| 20 | + |
| 21 | + |
| 22 | +Файлы README и LICENSE лучше создать заранее. На начальном этапе разработки они не нужны, но когда проект будет готов к публикации, они напомнят о том, что их надо заполнить. |
| 23 | + |
| 24 | +## Заполнение манифеста |
| 25 | + |
| 26 | +Каждый пакет, будь то приложение или библиотека для переиспользования в других проектах, должна иметь файл манифеста. Это файл с именем `packagedef`, который описывает состав пакета: исходники, используемые библиотеки, название и версию, действия при установке и удалении пакета. |
| 27 | + |
| 28 | +Технически, манифест представляет собой файл скрипта и может содержать исполняемый код. Этот скрипт обрабатывается пакетным менеджером `opm` при сборке пакета. |
| 29 | + |
| 30 | +### Минимально необходимый манифест |
| 31 | + |
| 32 | +В манифесте обязательно должны быть указаны: |
| 33 | + |
| 34 | +* Имя пакета |
| 35 | +* Версия пакета |
| 36 | +* Состав пакета |
| 37 | + |
| 38 | +Как правило, также указываются зависимости, которые надо установить вместе с пакетом. На примере ниже указаны зависимости от библиотек `fs` и `asserts`. |
| 39 | + |
| 40 | +```bsl |
| 41 | +Описание.Имя("my-package") |
| 42 | + .Версия("1.0.0") |
| 43 | + .ВерсияСреды("2.0.0") |
| 44 | + .ЗависитОт("fs", "1.0.0") |
| 45 | + .ЗависитОт("asserts", "1.3.0") |
| 46 | + .ВключитьФайл("packagedef") |
| 47 | + .ВключитьФайл("src") |
| 48 | + .ВключитьФайл("oscript_modules") |
| 49 | + .ИсполняемыйФайл("src/my-script.os"); |
| 50 | +``` |
| 51 | + |
| 52 | +### Свойства манифеста |
| 53 | + |
| 54 | +* ВерсияСреды - минимально необходимая версия движка 1Скрипт, на которой будет работать пакет |
| 55 | +* ЗависитОт - указание библиотеки, которую использует наш пакет и, опционально, минимальный номер ее версии |
| 56 | +* ВключитьФайл - файл или каталог, который входит в состав пакета и будет включен в дистрибутив |
| 57 | +* ИсполняемыйФайл - если мы разрабатываем не библиотеку, а самостоятельное приложение, то здесь указываем путь к точке входа |
| 58 | + |
| 59 | +::: info Информация |
| 60 | +Полный перечень настроек манифеста содержится в документации к пакетному менеджеру opm. |
| 61 | +::: |
| 62 | + |
| 63 | +## Структура каталогов |
| 64 | + |
| 65 | +Большинство проектов не состоят из единственного файла, а разбиты на разные модули. 1Скрипт может загружать другие скрипты в виде двух сущностей: классы и модули |
| 66 | + |
| 67 | +### Класс |
| 68 | +Под классом понимается новый тип в системе типов приложения. Экземпляры объектов этого типа создаются через оператор **Новый**. |
| 69 | + |
| 70 | +```bsl |
| 71 | + // подключаем функционал JSON |
| 72 | + #Использовать json |
| 73 | +
|
| 74 | + Парсер = Новый ПарсерJSON(); // Тип ПарсерJSON объявлен в библиотеке |
| 75 | +``` |
| 76 | + |
| 77 | +### Модуль |
| 78 | + |
| 79 | +Модуль это то же самое, что ОбщийМодуль в системе 1С:Предприятие. Модуль - это свойство в глобальном контексте, методы которого мы можем вызывать из языка. |
| 80 | + |
| 81 | +```bsl |
| 82 | + // подключаем функционал JSON |
| 83 | + #Использовать json |
| 84 | +
|
| 85 | + Студент = Новый Структура("Имя,Фамилия", "Иван", "Петров"); |
| 86 | + // Модуль "РаботаСJSON" объявлен в библиотеке и доступен благодаря директиве #Использовать |
| 87 | + РаботаСJSON.ЗаписатьОбъект(Студент, "C:\students.json"); |
| 88 | +``` |
| 89 | + |
| 90 | +Стандартный загрузчик ориентируется на структуру каталогов. Внутри каталога src рекомендуется создать папки `Классы` и `Модули`. Все файлы *.os из каталога "Классы" будут подключены как классы (и их можно создать через `Новый`), а файлы *.os из каталога "Модули" - как общие модули. |
| 91 | + |
| 92 | +:::info Информация |
| 93 | +Подробности и принцип загрузки скриптов, а также модуль загрузчика описаны в разделе [Библиотеки](/learn/libraries) |
| 94 | +::: |
| 95 | + |
| 96 | +### Подключение собственных модулей пакета |
| 97 | + |
| 98 | +Для того, чтобы загрузчик отработал, необходимо в стартовом скрипте написать директиву импорта папки, в которой лежат подкаталоги `Классы` и `Модули`. |
| 99 | + |
| 100 | +Например, пусть наш стартовый скрипт `my-script.os` лежит в каталоге src корня репозитория. Рядом с ним лежат 2 каталога `Классы` и `Модули`. В них расположены файлы классов и модулей соответственно. Для того, чтобы `my-script.os` увидел эти классы и модули, нам надо отправить в загрузчик "приказ" о загрузке библиотеки. Однако, в данном случае, библиотекой являемся мы сами, наш собственный проект и мы сами себя должны импортировать в пространство стартового скрипта `my-script.os`. |
| 101 | + |
| 102 | +Делается это с помощью директивы `Использовать`, в качестве аргумента которой мы указываем текущий каталог (точку) |
| 103 | + |
| 104 | +```bsl |
| 105 | +// Файл my-script.os |
| 106 | +// Импортируем текущую папку (в ней лежат подпапки Классы и Модули, которые обработает загрузчик) |
| 107 | +
|
| 108 | +#Использовать "." |
| 109 | +
|
| 110 | +// Использование модуля |
| 111 | +Сообщить(МойМодуль.КакойТоМетодМодуля()) |
| 112 | +
|
| 113 | +``` |
0 commit comments