sergey vasin

The IT blog

Развертывание модуля PowerShell с использованием Tasks в Visual Studio Code

leave a comment »

Когда мы пишем скрипты или функции, чаще всего для этого мы создаем какую-либо структуру папок (Plaster?) и уже в ней сохраняем наши .ps1 и .psm1 и (возможно, многочисленные) тестовые и вспомогательные файлы.

Закончив с написанием кода, мы организуем рабочие файлы в виде модуля, создав необходимый манифест и копируем все необходимые компоненты в определенный каталог, чтобы они были доступны в среде PowerShell (скорее всего это будет C:\Program Files\WindowsPowerShell\Modules).

Иногда нам может потребоваться скопировать модуль из рабочей папки в его окончательное местоположение для того, чтобы протестировать его функциональность. Причин может быть много, к примеру, одна из них — правильно ли мы указали значение параметра -FunctionsToExport командлета New-ModuleManifest.

Одним из вариантов автоматизации этой операции будет использование функционала Tasks в Visual Studio Code.

Module

Предположим, мы решили заняться разработкой модуля с именем TheModule в каталоге C:\Scripts.

Для начала мы создадим папку TheModule:

New-Item -Path c:\Scripts\TheModule -ItemType Directory

Код нужной нам функции мы разместим в файле TheModule.psm1.
Пусть это будет следующая функция:

function Get-SomeProcess
{
    Get-Process -Name p*
}

Теперь нам нужно создать манифест. Создавать мы его будем при помощи командлета New-ModuleManifest. Однако, чтобы не вводить всю команду заново каждый раз при обновлении или изменении модуля, предлагаю сохранить ее в файле _helper.ps1.

Выглядеть она будет так:

$Params = @{
    Path = 'C:\Scripts\TheModule\TheModule.psd1'
    RootModule = 'TheModule.psm1'
    ModuleVersion = '1.0'
}

New-ModuleManifest @Params

Запустив вышеприведенный код, мы создадим файл TheModule.psd1 в каталоге C:\Scripts\TheModule.

Теперь нам нужно скопировать этот модуль в каталог C:\Program Files\WindowsPowerShell\Modules. Для этого мы создадим задачу.

Script

Представлять из себя она будет PowerShell-скрипт для удаления предыдущей версии модуля из C:\Program Files\WindowsPowerShell\Modules и копирования в него текущей версии.

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

Сам скрипт мы расположим в файле _deployModule.ps1.

Текст скрипта будет следующим:

Remove-Item -Path 'C:\Program Files\WindowsPowerShell\Modules\TheModule' -Recurse -ErrorAction SilentlyContinue
New-Item -ItemType Directory -Path 'C:\Program Files\WindowsPowerShell\Modules\TheModule'
Copy-Item -Path .\* -Include *.psd1, *.psm1, *.ps1 -Exclude _* -Destination 'C:\Program Files\WindowsPowerShell\Modules\TheModule'

В первой строке мы удаляем весь модуль из папки назначения, во второй создаем новую папку TheModule, а в третьей копируем в нее все файлы с расширениями .psd1, .psm1 и .ps1 за исключением тех, что начинаются с символа подчеркивания.

Теперь перейдем непосредственно к созданию задачи.

Task

Для этого выберем пункт меню Tasks -> Configure Tasks… Затем в поле Select a task to configure выберем Create tasks.json file from template. При запросе Select a task template выберем Others.

Результатом станет создание файла tasks.json в подкаталоге .vscode и его открытие для редактирования.

В качестве примера в файле tasks.json уже будет приведена задача с именем echo. Добавим к ней еще одну.

Нам потребуется указать парметры taskName, type и command.

В качестве значения taskName мы укажем DeployModule.

Параметр type мы определим как shell. Это означает, что команда будет выполнена в самой оболочке, в отличие от значения process, когда задача выполняется в виде отдельного процесса.

Значение параметра command мы определим как «.\\_deployModule.ps1», что указывает на нужный нам скрипт. Стоит отметить, что символ \ в формате json представляет из себя escape-символ, поэтому для того, чтобы указать, что мы имеем в виду именно backslash, потребуется ввести его два раза.

Файл tasks.json будет выглядеть следующим образом:

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "taskName": "echo",
            "type": "shell",
            "command": "echo Hello"
        },
        {
            "taskName": "DeployModule",
            "type": "shell",
            "command": ".\\_deployModule.ps1"
        }
    ]
}

Теперь, сохранив файл tasks.json, мы можем использовать созданную нами задачу.

Для этого нам потребуется выбрать пункт меню Tasks -> Run Task…, при запросе Select the task to run указать DeployModule, и далее — Continue without scanning the task output.

Для того, чтобы более на получать предложений о сканировании результатов выполнения задачи, вместо Continue without task scanning вы можете указать Never scan the task output, что приведет к добавлению строки

            "problemMatcher": [] 

к определению задачи в файле tasks.json, тем самым предотвращая появление подобных запросов.

Кроме того, в меню Tasks вы можете выбрать пункт Configure Default Build Task… и при запросе Select the task to be used as the default build task выбрать нужную вам задачу, в нашем случае это DeployModule. После этого в файле tasks.json появятся следующие строки:

            "group": {
                "kind": "build",
                "isDefault": true
            }

что предоставит вам возможность запускать эту задачу, выбирая пункт меню Tasks -> Run Build Task…, или же нажимая сочетание клавиш Ctrl + Shift + B.

В итоге файл tasks.json будет выглядеть следующим образом:

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "taskName": "echo",
            "type": "shell",
            "command": "echo Hello"
        },
        {
            "taskName": "DeployModule",
            "type": "shell",
            "command": ".\\_deployModule.ps1",
            "problemMatcher": [],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

Кроме использования меню Tasks, вы можете выполнить нужное вам действие, нажав сочетание клавиш Ctrl + Shift + P, вызвав тем самым меню команд, и введя tasks, после чего вам будут предожены все действия, содержащие слово tasks в своем названии.

Shell

После копирования модуля в каталог C:\Program Files\WindowsPowerShell\Modules содержащиеся в нем функции будут доступны в консоли PowerShell. Однако, если вы обновили содержимое модуля и скопировали его измененную версию поверх предыдущей, консоль все еще будет будет использовать более раннюю его версию.

Для того, чтобы обновить определения функций модуля без закрытия и повторного открытия консоли, мы можем воспользоваться командлетом Import-Module с параметром -Force. Например, так:

Import-Module -Name TheModule -Force

Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

Written by Сергей Васин

Ноябрь 2, 2017 в 10:06

Опубликовано в PowerShell, Visual Studio Code

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s