# Создание пакета из Visual Studio

При разработке сборок для публикации в виде пакета для Dynamo можно настроить проект таким образом, чтобы сгруппировать все необходимые компоненты и поместить их в структуру папок, совместимую с пакетом. Это позволит быстро протестировать проект в виде пакета и смоделировать работу пользователя.

#### Сборка в папку пакета <a href="#how-to-build-directly-to-the-package-folder" id="how-to-build-directly-to-the-package-folder"></a>

Существует два способа сборки пакета в Visual Studio.

* Добавьте события после сборки в диалоговом окне «Параметры проекта», в котором для копирования необходимых файлов используются сценарии xcopy или Python.
* Используйте целевой объект сборки AfterBuild в файле `.csproj` для создания задач копирования файлов и каталогов.

Метод AfterBuild предпочтителен для этих типов операций (в том числе в данном руководстве), так как он не зависит от копирования файлов, которые могут быть недоступны на компьютере сборки.

#### Копирование файлов пакетов с помощью метода AfterBuild <a href="#copy-package-files-with-the-afterbuild-method" id="copy-package-files-with-the-afterbuild-method"></a>

Настройте структуру папок в репозитории так, чтобы исходные файлы были отделены от файлов пакетов. При работе с примером CustomNodeModel поместите проект Visual Studio и все связанные файлы в новую папку `src`. Все пакеты, созданные в проекте, будут сохранены в этой папке. Структура папок должна выглядеть следующим образом:

```
CustomNodeModel
> src
  > CustomNodeModel
  > CustomNodeModelFunction
  > packages
  > CustomNodeModel.sln
```

> 1. Переместите файлы проекта в новую папку `src`.

Теперь, когда исходные файлы находятся в отдельной папке, добавьте целевой объект `AfterBuild` в файл `CustomNodeModel.csproj` в Visual Studio. При этом необходимые файлы будут скопированы в новую папку пакета. Откройте файл `CustomNodeModel.csproj` в текстовом редакторе (мы использовали [Atom](https://atom.io)) и поместите цель сборки перед закрывающим тегом `</Project>`. Целевой объект AfterBuild скопирует все файлы DLL, PBD, XML и CONFIG в новую папку bin и создаст папку dyf и дополнительные папки.

```
  <Target Name="AfterBuild">
    <ItemGroup>
      <Dlls Include="$(OutDir)*.dll" />
      <Pdbs Include="$(OutDir)*.pdb" />
      <Xmls Include="$(OutDir)*.xml" />
      <Configs Include="$(OutDir)*.config" />
    </ItemGroup>
    <Copy SourceFiles="@(Dlls)" DestinationFolder="$(SolutionDir)..\packages\CustomNodeModel\bin\" />
    <Copy SourceFiles="@(Pdbs)" DestinationFolder="$(SolutionDir)..\packages\CustomNodeModel\bin\" />
    <Copy SourceFiles="@(Xmls)" DestinationFolder="$(SolutionDir)..\packages\CustomNodeModel\bin\" />
    <Copy SourceFiles="@(Configs)" DestinationFolder="$(SolutionDir)..\packages\CustomNodeModel\bin\" />
    <MakeDir Directories="$(SolutionDir)..\packages\CustomNodeModel\dyf" />
    <MakeDir Directories="$(SolutionDir)..\packages\CustomNodeModel\extra" />
  </Target>
```

> Необходимо убедиться, что целевой объект добавлен в файл `CustomNodeModel.csproj` (а не в другой файл проекта) и что в проекте нет параметров, заданных после сборки.
>
> 1. Поместите целевой объект AfterBuild перед закрывающим тегом `</Project>`.

В разделе `<ItemGroup>` задается ряд переменных, представляющих определенные типы файлов. Например, переменная `Dll` представляет все файлы в выходной папке с расширением `.dll`.

```
<ItemGroup>
  <Dlls Include="$(OutDir)*.dll" />
</ItemGroup>
```

Задача `Copy` состоит в том, чтобы скопировать все файлы `.dll` в каталог, а именно в папку пакета, в которую мы выполняем сборку.

```
<Copy SourceFiles="@(Dlls)" DestinationFolder="$(SolutionDir)..\packages\CustomNodeModel\bin\" />
```

Пакеты Dynamo обычно содержат папку `dyf` и `extra` для пользовательских узлов Dynamo и других компонентов, например изображений. Чтобы создать эти папки, необходимо использовать задачу `MakeDir`. Если папка отсутствует, эта задача создаст ее. В эту папку можно добавить файлы вручную.

```
<MakeDir Directories="$(SolutionDir)..\packages\CustomNodeModel\extra" />
```

Теперь при построении проекта в папке проекта будет находится папка `packages` рядом с ранее созданной папкой `src`. В каталоге `packages` находится папка, содержащая все необходимые для пакета компоненты. Также необходимо скопировать файл `pkg.json` в папку пакета, чтобы сообщить Dynamo о необходимости загрузки пакета.

> 1. Новая папка пакетов, созданная целевым объектом AfterBuild.
> 2. Существующая папка src с проектом.
> 3. Папки `dyf` и `extra`, созданные из целевого объекта AfterBuild.
> 4. Скопируйте файл `pkg.json` вручную.

Теперь можно опубликовать пакет с помощью диспетчера пакетов Dynamo или скопировать его непосредственно в папку пакетов Dynamo: `<user>\AppData\Roaming\Dynamo\1.3\packages`.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://primer2.dynamobim.org/ru/1_developer_primer_intro/3_developing_for_dynamo/1-build-a-package-from-visual-studio.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
