Разработка команд 1C:EDT CLI #
1C:EDT CLI (далее — CLI) можно расширить собственными командами. Для этого необходимо подключиться к точке расширения com.e1c.g5.v8.dt.cli.api.cliCommand
классом, реализующим интерфейс com.e1c.g5.v8.dt.cli.api.ICliCommand
. Если вы хотите иметь доступ к сервисам из команды, то подключаться нужно через фабрику создания расширений, как описано в разделе
Публичные сервисы.
В интерфейсе ICliCommand
нет методов: это интерфейс-маркер, который указывает, что данный класс предоставляет команды CLI. Все методы класса, помеченные аннотацией @com.e1c.g5.v8.dt.cli.api.CliCommand
, будут зарегистрированы в качестве команд CLI с именами, аналогичными именам методов, но в “kebab-case” (то есть один класс может предоставить несколько команд CLI).
Если имя метода начинается с
_, set, get
илиis
, эти приставки будут удалены при регистрации команды. То есть метод c именем_import
будет зарегистрирован как командаimport
. Это позволяет использовать ключевые слова Java и типичные геттеры и сеттеры Java как команды CLI без лишних приставок.Также будут удалены приставки
с0_, с1_, ..., с9_
. Их можно использовать, если нужно сделать в одном классе несколько команд с одинаковым именем, принимающих одинаковые по количеству и типам параметры, но различающихся по названиям аргументов (см. ниже).
Пример реализации команды platform-versions
:
|
|
Значение аннотации @CliCommand
— это справка о команде. Она может быть как обычным текстом, так и названием переменной класса Messages
из того же пакета, где лежит класс, реализующий команду. В последнем случае мы можем использовать NLS
(фреймворк для локализации в Eclipse) для локализации справки по командам.
Команда может выдать результат напрямую в System.out
(например, при помощи System.out.println()
). Потоки System.out/in/err
переназначены для команд, поэтому, даже если команда участвует в pipe, вывод в System.out
будет корректно передан дальше по pipe.
BaseCliCommand #
Вместо реализации интерфейса ICliCommand
напрямую вы можете унаследоваться от класса com.e1c.g5.v8.dt.cli.api.components.BaseCliCommand
, который предоставляет дополнительные возможности по работе с проектами и рабочей областью (workspace).
Если вы наследуете свой класс от BaseCliCommand
, то для подключения к точке расширения вам нужно реализовать свою фабрику создания расширений, унаследовав ее от класса com.e1c.g5.v8.dt.cli.api.components.BaseCliCommandExtensionFactory
.
Аргументы команд #
Команда CLI может иметь аргументы, которые передаются как аргументы метода, реализующего команду. Рассмотрим на примере реализации команды import
:
|
|
Здесь мы видим, что команда import
имеет обязательные аргументы --configuration-files
и --project
, а также необязательные аргументы (для которых указано значение по умолчанию) --version
и --base-project-name
.
Для объявления аргументов служит аннотация @com.e1c.g5.v8.dt.cli.api.Argument
. Ее аргументы:
value
(необязательный) — список строк. Имена аргумента (ключи) в командной строке. Если опущен, аргумент не имеет ключа. Такой аргумент может быть только один, и он должен идти последним.descriptor
(необязательный) — строка. Справка по аргументу или имя переменной из классаMessages
(аналогично тому, что может быть задано в аннотации@CliCommand
для самого метода. См. выше).defaultValue
(необязательный) — строка. Значение по умолчанию, которое передается в аргумент функции, если пользователь указал этот аргумент в командной строке.
Типы аргументов #
Поддерживаемые типы аргументов:
- Примитивные типы (
int, boolean, float
и т. д.). String
.- Массивы других поддерживаемых типов (
int[], String[]
и т. д.).
Специальные аргументы #
Команда может иметь специальный аргумент типа com.e1c.g5.v8.dt.cli.api.ICliSession
. Этот аргумент не задается пользователем с командной строки, а подставляется интерпретатором команд. Поэтому этот аргумент не нужно оформлять через аннотацию @Argument
. Он предоставляет специализированные возможности, которые могут понадобиться для некоторых команд. Например, при помощи сессии можно попросить у пользователя ввести данные, как это делает стандартная команда exit
:
|
|
Перегрузка команд #
Можно определить несколько команд с одинаковым именем, но разными аргументами (воспользовавшись стандартной перегрузкой методов в Java). Если же вам нужны несколько команд с одинаковым именем и параметрами одинаковых типов, можете воспользоваться приставками c0_, c1_, ..., c9_
:
|
|
Запуск команд в режиме разработки (из Eclipse) #
Чтобы запустить CLI в режиме разработки (из Eclipse), нужно сделать следующее:
- Откройте меню редактирования конфигураций запуска Eclipse (Run -> Run Configurations… либо Debug Configurations…).
- Сделайте дубликат вашей обычной конфигурации для запуска плагинов (правый клик по конфигурации -> Duplicate). Дальше работайте с дубликатом.
- На вкладке Arguments:
- В Program Arguments допишите в конец через пробел
-console
. - В VM arguments допишите в конец через пробел.
(если здесь возникли трудности, см. ниже).-Declipse.ignoreApp=true -Dosgi.noShutdown=true -Dgosh.args=file:///C:/Users/username/path/to/1CEDT/installation/1cedtcli-startup.txt
- В Program Arguments допишите в конец через пробел
- Запустите эту конфигурацию.
- После загрузки появится приглашение “1C:EDT> " в консоли Eclipse (вкладка Console). Перейдите на вкладку Console и можете вводить команды.
- Если вы не видите приглашения, возможно, оно где-то выше. Нажмите Enter пару раз.
При таком способе запуска путь до файла
1cedtcli-startup.txt
не должен содержать пробелы и русскоязычные символы. Если путь до папки установки 1C:EDT содержит их, вы можете скопировать этот файл в любое место на диске с простым путем и указать этот путь.Если по каким-то причинам у вас нет файла
1cedtcli-startup.txt
, создайте обычный текстовый файл следующего содержания и используйте его:equinox:start com.e1c.g5.v8.dt.cli.api gogo:until { gogo:type -q 1csupport:edtsh } { } 1csupport:edtsh
Если вместо приглашения “1C:EDT> " вы видите приглашение “osgi> “, вы можете вручную ввести следующие команды:
equinox:start com.e1c.g5.v8.dt.cli.api <... подождать некоторое время, пока загрузится ...> 1csupport:edtsh
После этого, если все прошло успешно, вы увидите приглашение “1С> “.