Artikel ini adalah materi pelatihan yang menuntun Anda melalui proses membuat dan menerbitkan komponen baru untuk platform UiPath RPA . Hal ini sesuai untuk beberapa kasus, misalnya, untuk integrasi sederhana dengan sistem perusahaan atau dalam situasi di mana perusahaan ingin membantu karyawan yang tidak memiliki pengetahuan khusus dalam pemrograman untuk membuat proses robot mereka sendiri. Tetapi, bagi saya, teknik ini bekerja sangat baik untuk kasus-kasus ketika Anda perlu mengintegrasikan produk Anda ke dalam ekosistem robotika, memungkinkan pengguna untuk mengkonfigurasi integrasi proses internal dalam beberapa klik. Contohnya adalah konektor yang ditulis oleh Abbyy untuk produk Abbyy Flexicapture Distributed . Contoh lain adalah UiPath itu sendiri, yang dengan demikian mengimplementasikan koneksi ke modul-ML baru untuk visi komputer (Computer Vision dalam manajer paket), tindakan untuk bekerja dengan PDF, dll.
Sekarang di toko aplikasi UiPath Go! sudah dalam ayunan penuh mulai muncul konektor untuk solusi populer seperti Salesforce atau ServiceNow, dan kemungkinan besar, tren ini hanya mendapatkan popularitas.
Jadi, bagaimana Anda mulai mengembangkan tindakan Anda sendiri?
NB Dalam bahasa Inggris, suatu tindakan adalah suatu Kegiatan, ingatlah ini jika Anda perlu mencari sesuatu di google
Jika Anda tidak ingin melakukan semua pengaturan, Anda dapat mencoba kode contoh yang diambil dalam langkah-langkah dalam tutorial ini. Itu terletak di GitLab . Kode dalam artikel ini disingkat dan disederhanakan, tersedia di Yandex Disk

Apa yang kita butuhkan sebelum mulai bekerja:
- Visual Studio (versi gratis VS Community Edition sempurna. Selama instalasi, Anda harus memilih .NET Desktop Development atau secara manual menentukan paket berikut:
- Manajer paket nuget
- Paket penargetan .NET Framework 4.6.1 (4.6 dibutuhkan)
- C # dan Visual Basic (tindakan dapat ditulis dalam bahasa .NET apa pun, tetapi, secara tradisional, C # atau VB.NET digunakan). Tutorial ini akan menggunakan C #.
- Windows Workflow Foundation
- UiPath Studio (dan di sini hal yang sama, CE gratis, Anda hanya perlu mengisi formulir aplikasi Edisi Komunitas UiPath ).
NB Untuk pengembangan aksi itu sendiri, kita tidak membutuhkannya, tetapi, tentu saja, saya ingin melihat apa yang akan kita lakukan.
- NuGet Package Manager (dibundel dengan VS 2017+ atau diunduh dari Nuget.org
Mulai membuat
Buat proyek dalam VS
- Buat proyek
C# Class Library (.NET Framework)
. Harap perhatikan bahwa variasi pada tema (mis. Perpustakaan Kelas C (Standar NET) ) tidak cocok untuk kami.

- Kami memilih nama yang bermakna untuknya (format biasa <Developer> .UiPath.Activities. <Project Name> ) dan menunjukkan bahwa kami ingin menggunakan
.NET Framework 4.6.1
.
ID paket NuGet harus berisi kata Activities. Karena kami ingin mengambil semuanya dari VS, lebih baik segera memberi nama proyek dengan benar sehingga Anda dapat mengambilnya di NuGet nanti.

- Di proyek yang dibuat, buat subfolder berikut (ini adalah langkah opsional, tetapi lebih nyaman untuk bekerja dengan paket tindakan ketika Anda ingin memberikan lebih dari satu tindakan pada satu pengguna pada suatu waktu dan jumlah file mulai menumpuk):
- Aktivitas (di sini kita akan memiliki kode tindakan)
- Desainer (di sini kita akan memiliki jendela tindakan)
- Sumberdaya (di sini kami akan menyimpan gambar, ikon dan hal-hal lain yang diperlukan)
- Ganti nama file Class1.cs yang bagi kami buat dalam VS sesuai dengan nama tindakan pertama kami dan pindahkan ke folder Aktivitas.

Pembuatan dan penerbitan tindakan mudah
Pada titik ini, kami memiliki proyek kosong yang dikompilasi menjadi .dll
. Sekarang mari kita beralih ke membuat aksi itu sendiri.
NB Karena UiPath mendukung beberapa bahasa, pada akhirnya, kita perlu menambahkan lokalisasi, dan sedikit mengubah apa yang kita lakukan sekarang, tetapi mari kita mulai dengan apa yang perlu dan cukup.
- Kami membutuhkan dua
using
:
using System; using System.Activities;
- Kami
CodeActivity
kelas kami dari CodeActivity
:
public class TutorialForHabr: CodeActivity {}
- Kami mengatur parameter input dan output:
public class TutorialForHabr: CodeActivity { public InArgument<Int32> Row { get; set; } public InArgument<Int32> Column { get; set; } public OutArgument<String> Cell { get; set; } }
Parameter NB Action adalah input InArgument< >
, output OutArgument< >
dan dicampur, memungkinkan keduanya untuk menerima dan menerima parameter InOutArgument< >
- Dan metode
Execute
, yang merupakan satu-satunya metode yang harus kita tentukan:
protected override void Execute(CodeActivityContext context) { string colstr = "";
Pada tahap ini, kami memiliki aksi kerja untuk UiPath yang mengimplementasikan fungsionalitas yang sederhana namun perlu.
Kami akan menerbitkannya, dan kemudian beralih ke bagian kedua dan mengambil, sedikit, "dekorasi".
Terbitkan melalui NuGet
Anda dapat membuat paket NuGet melalui GUI NuGet Package Manager atau melalui baris perintah dengan memanggil nuget.exe pack
. Perintah pack
menerima dua parameter utama sebagai input: nama file proyek .csproj atau nama file .nuspec yang berisi informasi meta paket. Opsi pertama tidak memungkinkan kami, tanpa modifikasi manual tambahan dari file .json, untuk mengatur beberapa properti paket yang penting bagi kami, misalnya tag, lisensi atau URL repositori, plus itu tidak memungkinkan kami untuk menetapkan ikon untuk proyek yang akan terlihat pada manajer paket.
Dalam varian kedua, kami menduplikasi beberapa properti paket, yang, bagaimanapun, dapat secara otomatis diambil dari Visual Studio.
Oleh karena itu, kita akan pergi sepanjang jalan 1.5, dan membuat file dengan ekstensi .nuspec di root proyek (nama tidak masalah, hanya ada satu file seperti itu), yang akan berisi informasi yang tidak dapat diperoleh dari .csproj dan menggabungkan dua sumber data ini.
<?xml version="1.0" encoding="utf-8"?> <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> <metadata> <id>$id$</id> <title>$title$</title> <version>$version$</version> <authors>$author$</authors> <owners>$author$</owners> <requireLicenseAcceptance>false</requireLicenseAcceptance> <licenseUrl>https://choosealicense.com/licenses/mit/</licenseUrl> <projectUrl>https://gitlab.com/ilyak/ilyak.uipath.activities</projectUrl> <iconUrl>http://www.uipath.com/hubfs/Logos/uipath-nuget-logo.png</iconUrl> <description>$description$</description> <copyright>$copyright$</copyright> <tags>UiPath,Activity,Excel</tags> </metadata> <files> <file src="bin\Debug\IlyaK.UiPath.Activities.TutorialForHabr.dll" target="lib\net461\IlyaK.UiPath.Activities.TutorialForHabr.dll" /> </files> </package>
Seperti yang Anda lihat, struktur .nuspec cukup jelas. Jika Anda enggan mengacaukan XML, Anda dapat membuatnya melalui editor visual NuGet Package Manager dan menyimpannya di folder proyek untuk digunakan di masa mendatang. Variabel seperti $copyright
diambil dari informasi yang terkandung dalam file .dll, yaitu dari Visual Studio.
Sekarang kita ingin menggunakan .nuspec kita sehingga dengan setiap build kita mendapatkan paket baru. Untuk melakukan ini, kita pergi ke Properties dan pergi ke tab Build Events.
Tulis kata-kata ajaib di baris perintah event Post-build
IF EXIST "$(ProjectDir)$(OutDir)*.nupkg" del "$(ProjectDir)$(OutDir)*.nupkg" nuget.exe pack "$(ProjectPath)" IF EXIST "$(ProjectDir)$(OutDir)*.nupkg" xcopy /Y "$(ProjectDir)$(OutDir)*.nupkg" "C:\Program Files (x86)\UiPath\Studio\Packages\"
yang, diterjemahkan ke dalam bahasa Rusia, berarti
- Hapus paket lama di folder tempat pembuatan dibuat
- Buat paket baru menggunakan file .csproj dan .nuspec
- Masukkan ke dalam folder
C:\Program Files (x86)\UiPath\Studio\Packages\
Apa folder ini? Ini adalah repositori paket lokal yang digunakan oleh UiPath Studio. Segera setelah paket baru muncul di sana, itu akan secara otomatis tersedia melalui manajer paket dan dimungkinkan untuk menambahkannya ke proses robotisasi.

NB Jalur ke repositori lokal dapat diubah melalui pengaturan UiPath Studio sehingga nyaman untuk menyalin file di sana jika ada masalah dengan izin.

Itu saja, sebenarnya, selamat!
NB Harap dicatat bahwa smart Studio itu sendiri membuat kategori untuk tindakan kami, menggunakan titik-titik sebagai tingkat bersarang, dan menempatkan spasi di depan huruf kapital atas nama tindakan.
Bagian selanjutnya dari artikel ini adalah tentang "kecantikan": tentang bagaimana membuat antarmuka visual untuk suatu tindakan, menetapkan ikon dan melokalkan teks.
Serius
Atribut
Agar tindakan kita berhasil, bagian pertama sudah cukup. Tapi saya ingin kita bisa memilih kategori, menunjukkan tips, dll.
Untuk ini kita perlu atribut. Ada atribut yang cocok untuk tindakan itu sendiri, dan untuk parameternya:
[Category (" , ")] [DisplayName (" ")] [Description (" ")]
Dan ada beberapa parameter yang hanya dibutuhkan:
[RequiredArgument]
Lokalisasi
Sayangnya, ada satu kehalusan dengan atribut: dalam versi Rusia UiPath Studio, nama-nama kategori tindakan dan kategori properti mereka juga diterjemahkan. Dengan demikian, jika kita mengatur atribut [Category("Input")]
untuk parameter input, itu akan ditampilkan dengan benar dalam versi bahasa Inggris, tetapi dalam versi Rusia itu akan jatuh ke dalam kategori Input sendiri yang terpisah, dan tidak ke dalam kategori Input standar. Hal yang sama berlaku untuk tindakan, dalam versi Rusia, Integrasi Aplikasi menjadi Integrasi Aplikasi .
Jadi kita perlu memindahkan konstanta teks ke sumber daya yang tergantung pada bahasa dan menggunakannya dari sana.
Untuk melakukan ini, buat file ajaib Localization.cs yang berisi fungsi untuk melokalisasi atribut
Localization.cs using IlyaK.UiPath.Activities.TutorialForHabr.Properties; using System; using System.ComponentModel; namespace IlyaK.UiPath.Activities.TutorialForHabr { [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Parameter | AttributeTargets.Delegate | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter)] public class LocalizedCategoryAttribute : CategoryAttribute { public LocalizedCategoryAttribute(string category) : base(category) { } protected override string GetLocalizedString(string value) { return Resources.ResourceManager.GetString(value) ?? base.GetLocalizedString(value); } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Class)] public class LocalizedDisplayNameAttribute : DisplayNameAttribute { public LocalizedDisplayNameAttribute(string displayName) : base(displayName) { } public override string DisplayName { get { return Resources.ResourceManager.GetString(DisplayNameValue) ?? base.DisplayName; } } } public class LocalizedDescriptionAttribute : DescriptionAttribute { public LocalizedDescriptionAttribute(string displayName) : base(displayName) { } public override string Description { get { return Resources.ResourceManager.GetString(DescriptionValue) ?? base.Description; } } } }
Dia akan memungkinkan kita untuk mengganti desain
[Category("Name")
pada
[LocalizedCategory(nameof(Resources.CategoryName))]
agar mekanisme ini berfungsi, kita harus:
- Buat file sumber untuk bahasa yang akan kita terjemahkan, dalam kasus kami,
Resources.resx
dan Resources.ru.resx
di folder Resources
( Tambah -> Item Baru -> File Sumber Daya ). Pastikan nilai Access Modifier untuk sumber daya ada di Publik . - Tambahkan ke file tindakan kelas
using IlyaK.UiPath.Activities.TutorialForHabr.Properties;
Dan atur kelas dan semua parameter dengan atribut yang sesuai
[LocalizedCategory(nameof(Resources.AppIntegrationExcel))] [LocalizedDisplayName(nameof(Resources.TutorialForHabrName))] [LocalizedDescription(nameof(Resources.TutorialForHabrDescription))] public class TutorialForHabr : CodeActivity { [LocalizedCategory(nameof(Resources.Input))] [LocalizedDisplayName(nameof(Resources.RowName))] [LocalizedDescription(nameof(Resources.RowDescription))] public InArgument<Int32> Row { get; set; } [LocalizedCategory(nameof(Resources.Input))] [LocalizedDisplayName(nameof(Resources.ColumnName))] [LocalizedDescription(nameof(Resources.ColumnDescription))] public InArgument<Int32> Column { get; set; } [LocalizedCategory(nameof(Resources.Output))] [LocalizedDisplayName(nameof(Resources.CellName))] [LocalizedDescription(nameof(Resources.CellDescription))] }
- Agar perpustakaan dengan sumber daya Rusia jatuh ke dalam paket NuGet, Anda perlu menambahkan baris lain ke grup file di file .nuspec
<files> <file src="bin\Debug\IlyaK.UiPath.Activities.TutorialForHabr.dll" target="lib\net461\IlyaK.UiPath.Activities.TutorialForHabr.dll" /> <file src="bin\Debug\ru\**" target="lib\net461\ru\" /> </files>
Perancang
Untuk membuat tindakan kami terlihat cantik dalam proses dan memungkinkan pengguna memasukkan data tanpa merangkak ke properti, kami perlu menambahkan UI. Ini dilakukan melalui file XAML, yang, dengan bantuan Visual Studio, dapat diedit dalam antarmuka khusus, tetapi sebagian masih harus diperbaiki secara manual. Saya akan memberi Anda template untuk memulai, dan kemudian dokumentasi Microsoft patut dilihat.
- Masukkan ikon untuk tindakan di folder
Resources
. Dalam properti Build Action diatur ke Sumber Daya (bukan Sumber Daya Tertanam ) - Buat Perancang Aktivitas baru ( Tambah -> Item Baru -> Perancang Aktivitas ) dalam folder
Designer
dan sebut TutorialForHabr
TutorialForHabr.xaml <sap:ActivityDesigner x:Class="IlyaK.UiPath.Activities.TutorialForHabr.Designer.TutorialForHabrDesigner" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:resource="clr-namespace:IlyaK.UiPath.Activities.TutorialForHabr.Properties" xmlns:sap="clr-namespace:System.Activities.Presentation;assembly=System.Activities.Presentation" xmlns:sapc="clr-namespace:System.Activities.Presentation.Converters;assembly=System.Activities.Presentation" xmlns:sapv="clr-namespace:System.Activities.Presentation.View;assembly=System.Activities.Presentation"> <sap:ActivityDesigner.Resources> <ResourceDictionary> <sapc:ArgumentToExpressionConverter x:Key="ArgumentToExpressionConverter" /> </ResourceDictionary> </sap:ActivityDesigner.Resources> <DockPanel Width="200"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="70"></ColumnDefinition> <ColumnDefinition Width="130"></ColumnDefinition> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition></RowDefinition> <RowDefinition></RowDefinition> </Grid.RowDefinitions> <TextBlock Grid.Row="0" Grid.Column="0" Text="{x:Static resource:Resources.RowName}" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,0,5,0"></TextBlock> <sapv:ExpressionTextBox Grid.Row="0" Grid.Column="1" OwnerActivity="{Binding Path=ModelItem}" ExpressionType="{x:Type s:Int32}" HintText="{x:Static resource:Resources.RowDescription}" Expression="{Binding Path=ModelItem.Row, Converter={StaticResource ArgumentToExpressionConverter},ConverterParameter=In, Mode=TwoWay}"/> <TextBlock Grid.Row="1" Grid.Column="0" Text="{x:Static resource:Resources.ColumnName}" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,0,5,0"></TextBlock> <sapv:ExpressionTextBox Grid.Row="1" Grid.Column="1" OwnerActivity="{Binding Path=ModelItem}" ExpressionType="{x:Type s:Int32}" HintText="{x:Static resource:Resources.ColumnDescription}" Expression="{Binding Path=ModelItem.Column, Converter={StaticResource ArgumentToExpressionConverter},ConverterParameter=In, Mode=TwoWay}"/> </Grid> </DockPanel> <sap:ActivityDesigner.Icon> <DrawingBrush> <DrawingBrush.Drawing> <ImageDrawing> <ImageDrawing.Rect> <Rect Location="0,0" Size="32,32" ></Rect> </ImageDrawing.Rect> <ImageDrawing.ImageSource> <BitmapImage UriSource="/IlyaK.UiPath.Activities.TutorialForHabr;component/Resources/Tutorial_32x32.png"></BitmapImage> </ImageDrawing.ImageSource> </ImageDrawing> </DrawingBrush.Drawing> </DrawingBrush> </sap:ActivityDesigner.Icon> </sap:ActivityDesigner>
Ini adalah cara kami mengatur label lokal:
<TextBlock Grid.Row="0" Grid.Column="0" Text="{x:Static resource:Resources.RowName}" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,0,5,0" />
, dan ini adalah kolom input. ExpressionType
menetapkan jenis bidang, HintText
- petunjuk (teks abu-abu) untuk itu, Expression
mengaitkan nilai bidang dengan tindakan kami
<sapv:ExpressionTextBox OwnerActivity="{Binding Path=ModelItem}" Grid.Row="0" Grid.Column="1" ExpressionType="{x:Type s:Int32}" HintText="{x:Static resource:Resources.RowDescription}" Expression="{Binding Path=ModelItem.Row, Converter={StaticResource ArgumentToExpressionConverter},ConverterParameter=In, Mode=TwoWay}" />
NB Perhatikan tag BitmapImage di akhir file. Jadi kami mengatur gambar untuk ikon dengan tautan ke file sumber. Ini adalah fungsi yang sangat rapuh dan kadang-kadang Anda harus mengotak-atiknya.
menurut hasil itu akan berubah seperti ini:

- Buat kelas DesignerMetata di folder Aktivitas
DesignerMetata.cs using System.Activities.Presentation.Metadata; using System.ComponentModel; namespace IlyaK.UiPath.Activities.TutorialForHabr.Design { public class DesignerMetadata : IRegisterMetadata { public void Register() { AttributeTableBuilder attributeTableBuilder = new AttributeTableBuilder(); attributeTableBuilder.AddCustomAttributes(typeof(TutorialForHabr), new DesignerAttribute(typeof(Designer.TutorialForHabrDesigner))); MetadataStore.AddAttributeTable(attributeTableBuilder.CreateTable()); } } }
- Jalankan build
- Dan perbarui paket di UiPath Studio.
NB Agar ini berhasil bagi Anda, perlu bahwa versi paket baru berbeda dari versi yang lama. Cara termudah untuk melakukan ini adalah dengan beberapa plugin Visual Studio, seperti Add-In Peningkatan Versi Build . Atau perbarui versi secara manual.
Berikut ini adalah tampilan akhir dari tindakan kami, dengan ikon dan kolom input:

Kesimpulan
Saya harap saya bisa menunjukkan bahwa membuat tindakan yang sepenuhnya berbingkai untuk UiPath tidak begitu lama. Saya benar-benar ingin artikel ini bermanfaat bagi Anda dan menjadi awal yang baik untuk menulis kegiatan baru dan hebat untuk UiPath. Dan ketika Anda membuatnya - jangan lupa untuk mempublikasikannya di UiPath Go!
Bahan tambahan