# Сведения о рабочих областях CodeQL

CodeQL рабочих пространств позволяют разрабатывать и поддерживать несколько связанных CodeQL пакетов вместе, разрешая зависимости между ними напрямую из источника.

## Сведения о рабочих областях CodeQL

Рабочее пространство CodeQL обычно используется для разработки набора библиотечных и запросных пакетов, зависящих друг от друга. При использовании рабочей области CodeQL все пакеты CodeQL в рабочей области доступны в качестве *зависимостей* источника при выполнении команды CodeQL, разрешающей запросы. Это упрощает разработку, обслуживание и публикацию нескольких связанных пакетов CodeQL. Дополнительные сведения о пакетах CodeQL см. в разделе [Настройка анализа с помощью пакетов CodeQL](/ru/code-security/codeql-cli/getting-started-with-the-codeql-cli/customizing-analysis-with-codeql-packs).

Рабочие пространства обычно хранятся в одном репозитории Git, чтобы связанные паки можно было разрабатывать и публиковать вместе.

## Зависимости источника

В рабочем пространстве CodeQL все пакеты, включённые в рабочее пространство, рассматриваются как **исходные зависимости** друг от друга. Это означает, что они разрешаются напрямую из локальной файловой системы, а не из кэша CodeQL пакета.

Потому что рабочие пакеты разрешаются из источника:

* Локальные изменения в одном наборе сразу видны другим наборам в рабочем пространстве.
* Зависимости, найденные в рабочем пространстве, переопределяют версии в кэше пакетов.
* Ограничения по версиям в `qlpack.yml` файлах игнорируются в зависимости от рабочего пространства, так как версия определяется содержимым рабочего пространства.

Это поведение особенно полезно при одновременной разработке нескольких связанных пакетов. Рассмотрим пример.

* Зависимость пока не опубликована и существует только локально.
* Вы вносите скоординированные изменения в несколько пакетов и хотите, чтобы они разрешались друг против друга во время тестирования.

Вне рабочего пространства зависимости разрешаются из кэша пакета и должны соответствовать ограничениям версии, определённым в `qlpack.yml`. Внутри рабочего пространства резолюция отдаёт приоритет локальному исходному контенту.

## CodeQL рабочих областей и разрешения запросов

Модель зависимости рабочего пространства влияет на то, как пакеты устанавливаются и публикуются.

* Во время установки зависимости, найденные в рабочем пространстве, не загружаются в кэш пакета и не записываются в `codeql-pack.lock.yml` файл.
* Во время публикации зависимости, предоставляемые рабочим пространством, объединяются с использованием локального исходного контента, а не версий из кэша пакетов.

Например, запуск `codeql pack install` в каталоге pack внутри рабочего пространства использует любые зависимости, найденные в этом пространстве, вместо того чтобы загружать их в кэш пакетов или записывать в `codeql-pack.lock.yml` файл. См [. раздел AUTOTITLE](/ru/code-security/codeql-cli/using-the-advanced-functionality-of-the-codeql-cli/creating-and-working-with-codeql-packs#adding-and-installing-dependencies).

### Example

Рабочее пространство CodeQL определяется YAML-файлом с именем `codeql-workspace.yml`. Рассмотрим следующий файл `codeql-workspace.yml`:

```yaml
provide:
  - "**/qlpack.yml"
```

И следующий файл пакета библиотеки `qlpack.yml` CodeQL в рабочей области:

```yaml
name: my-company/my-library
library: true
version: 1.0.0
```

И следующий файл пакета `qlpack.yml` запросов CodeQL в рабочей области:

```yaml
name: my-company/my-queries
version: 1.0.0
dependencies:
  my-company/my-library: "*"
  codeql/cpp-all: ~0.2.0
```

Обратите внимание, что `dependencies` блок для пакета `my-company/my-queries`запросов CodeQL указывает `"*"` версию пакета библиотеки. Так как пакет библиотеки уже определен как зависимость источника `codeql-workspace.yml`, содержимое пакета библиотеки всегда разрешается из рабочей области. Любое ограничение версии, указанное вами, будет игнорироваться в этом случае. Использование `"*"` для исходных зависимостей явно показывает, что версия унаследована из рабочего пространства.

При выполнении `codeql pack install` из каталога пакета запросов соответствующая версия `codeql/cpp-all` загружается в локальный кэш пакетов. Кроме того, `codeql-pack.lock.yml` создается файл, содержащий разрешенную версию `codeql/cpp-all`. Файл блокировки не будет содержать запись `my-company/my-library` , так как она разрешается из исходных зависимостей. Файл `codeql-pack.lock.yml` будет выглядеть примерно так:

```yaml
dependencies:
  codeql/cpp-all:
    version: 0.2.2
```

При выполнении `codeql pack publish` из каталога `codeql/cpp-all` пакета запросов зависимость от кэша пакетов и `my-company/my-library` рабочей области объединяются и `my-company/my-queries` публикуются в реестре контейнеров GitHub.

## Пример `codeql-workspace.yml` файла

Рабочее пространство CodeQL определяется YAML-файлом с именем `codeql-workspace.yml`. Этот файл содержит `provide` блок и при необходимости `ignore` и `registries` блоки.

* Блок `provide` содержит список шаблонов глобов, определяющих пакеты CodeQL, доступные в рабочей области.

* Блок `ignore` содержит список шаблонов глобов, определяющих пакеты CodeQL, которые недоступны в рабочей области.

* Блок `registries` содержит список URL-адресов GHES и шаблонов пакетов, которые управляют тем, какой реестр контейнеров используется для публикации пакетов CodeQL . См [. раздел AUTOTITLE](/ru/code-security/codeql-cli/using-the-advanced-functionality-of-the-codeql-cli/publishing-and-using-codeql-packs#working-with-codeql-packs-on-ghes).

Каждая запись в `provide` разделе `ignore` должна сопоставляться с расположением `qlpack.yml` файла. Все шаблоны glob определяются относительно каталога, содержащего файл рабочей области. Список шаблонов, принятых в этом файле, см. в разделе [@actions/glob](https://github.com/actions/toolkit/tree/main/packages/glob#patterns).

Например, следующий `codeql-workspace.yml` файл определяет рабочую область, содержащую все пакеты CodeQL, рекурсивно найденные в `codeql-packs` каталоге, за исключением пакетов в каталоге `experimental` . Блок `registries` указывает, что `codeql/\*` пакеты должны быть скачаны из `https://ghcr.io/v2/`реестра контейнеров по умолчанию GitHub. Все остальные пакеты следует скачать и опубликовать в реестре `GHE_HOSTNAME`.

```yaml
provide:
  - "*/codeql-packs/**/qlpack.yml"
ignore:
  - "*/codeql-packs/**/experimental/**/qlpack.yml"

registries:
 - packages: 'codeql/*'
   url: https://ghcr.io/v2/

 - packages: '*'
   url: https://containers.GHE_HOSTNAME/v2/
```

Вы можете перечислить пакеты, включённые в рабочее пространство, запустив `codeql pack ls` их в каталоге workspace.

## Использование `${workspace}` в качестве диапазона версий в файлах `qlpack.yml`

Пакеты CodeQL в рабочей области могут использовать специальные `${workspace}``~${workspace}``^${workspace}` заполнители и диапазон версий. Эти заполнители указывают, что этот пакет зависит от версии указанного пакета, который в настоящее время находится в рабочей области. Этот заполнитель обычно используется для зависимостей внутри пакетов библиотек, чтобы гарантировать, что при публикации зависимости в файле `qlpack.yml` отражают состояние рабочей области при их публикации.

### Example

Рассмотрим следующие два пакета библиотеки в одной рабочей области:

```yaml
name: my-company/my-library
library: true
version: 1.2.3
dependencies:
  my-company/my-library2: ${workspace}
```

```yaml
name: my-company/my-library2
library: true
version: 4.5.6
```

При `my-company/my-library` публикации в реестре контейнеров GitHub версия зависимости `my-company/my-library2` в опубликованном `qlpack.yml` файле будет записана как `4.5.6`.

Аналогичным образом, если зависимость находится `my-company/my-library2: ^${workspace}` в исходном пакете, а затем будет опубликован пакет, версия `my-company/my-library2` зависимости в опубликованном `qlpack.yml` файле будет записана как `^4.5.6`, указывающая, что версии `>= 4.5.6` и `< 5.0.0` все совместимы с этим пакетом библиотеки.

Если зависимость находится `my-company/my-library2: ~${workspace}` в исходном пакете, а затем будет опубликован пакет, версия `my-company/my-library2` зависимостей в опубликованном `qlpack.yml` файле будет записана как `~4.5.6`, указывающая, что версии `>= 4.5.6` и `< 4.6.0` все совместимы с этим пакетом библиотеки.