هذه المقالة عبارة عن مادة تدريبية ترشدك خلال عملية إنشاء ونشر مكون جديد لمنصة UiPath RPA . هذا مناسب في حالات مختلفة ، على سبيل المثال ، للتكامل البسيط مع أنظمة الشركة أو في الحالات التي تريد فيها الشركة مساعدة الموظفين الذين ليسوا على دراية خاصة بالبرمجة لإنشاء عملياتهم الخاصة للروبوتات. ولكن ، يبدو لي ، أن هذه الطريقة تعمل بشكل جيد في الحالات التي تحتاج فيها إلى دمج المنتج الخاص بك في النظام البيئي للروبوتات ، مما يتيح للمستخدمين تكوين تكامل العمليات الداخلية في بضع نقرات. مثال على ذلك هو الرابط الذي كتبه Abbyy لمنتج Abbyy Flexicapture Distributed . مثال آخر هو UiPath نفسها ، التي نفذت بالتالي الاتصال بوحدة ML الجديدة الخاصة برؤية الكمبيوتر (Computer Vision في مدير الحزمة) ، وإجراءات العمل مع PDF ، إلخ.
الآن في متجر تطبيقات UiPath Go! بالفعل على قدم وساق بدأت تظهر روابط للحلول الشائعة مثل Salesforce أو ServiceNow ، والأرجح أن هذا الاتجاه يكتسب شعبية فقط.
لذلك ، كيف تبدأ تطوير العمل الخاص بك؟
ملحوظة: في اللغة الإنجليزية ، يعتبر الإجراء نشاطًا ، تذكر هذا إذا كنت بحاجة إلى google شيء ما
إذا كنت لا ترغب في القيام بجميع الإعدادات ، فيمكنك تجربة رمز المثال الذي تم اتخاذه في خطوات في هذا البرنامج التعليمي. انها تقع على GitLab . الرمز في المقالة مختصرة ومبسطة ، وهو متاح على قرص ياندكس

ما نحتاجه قبل أن نبدأ العمل:
- Visual Studio (الإصدار المجاني من VS Community Edition مثالي. أثناء التثبيت ، يجب عليك تحديد .NET Desktop Development أو تحديد الحزم التالية يدويًا:
- مدير حزمة Nuget
- .NET Framework 4.6.1 حزمة الاستهداف (4.6 ضرورية)
- C # و Visual Basic (يمكن كتابة الإجراءات بأي لغة من لغات .NET ، ولكن تقليديا ، يتم استخدام C # أو VB.NET). سيستخدم هذا البرنامج التعليمي C #.
- ويندوز سير العمل الأساس
- UiPath Studio (وهنا الشيء نفسه ، CE المجاني ، تحتاج فقط إلى ملء نموذج طلب UiPath Community Edition ).
ملحوظة: لتطوير العمل نفسه ، نحن لسنا بحاجة إليه ، لكن بالطبع أريد أن أرى ما سنفعله.
- مدير حزمة NuGet (مرفق مع VS 2017+ أو تم تنزيله من Nuget.org
البدء في إنشاء
إنشاء مشروع في VS
- إنشاء مشروع
C# Class Library (.NET Framework)
. يرجى ملاحظة أن الأشكال المختلفة للموضوع (مثل C # Class Library (.NET Standard) ) لا تناسبنا.

- نختار اسمًا ذا معنى له (التنسيق المعتاد <Developer> .UiPath.Activities. <اسم المشروع> ) ونشير إلى أننا نريد استخدام
.NET Framework 4.6.1
.
يجب أن يحتوي معرف حزمة NuGet على كلمة الأنشطة. نظرًا لأننا نرغب في الحصول على كل شيء من VS ، فمن الأفضل تسمية المشروع على الفور بشكل صحيح بحيث يمكنك استلامه في NuGet لاحقًا.

- في المشروع الذي تم إنشاؤه ، أنشئ المجلدات الفرعية التالية (هذه خطوة اختيارية ، ولكنها أكثر ملاءمة للعمل مع حزم الإجراءات عندما تريد تزويد المستخدمين بأكثر من إجراء واحد في كل مرة ويبدأ عدد الملفات في التجميع):
- الأنشطة (هنا سيكون لدينا رمز عمل)
- المصمم (هنا سيكون لدينا شكل نافذة عمل)
- الموارد (سنقوم هنا بتخزين الصور والرموز والأشياء الضرورية الأخرى)
- إعادة تسمية الملف Class1.cs الذي تم إنشاؤه لنا في VS وفقًا لاسم الإجراء الأول الخاص بنا ونقله إلى مجلد "الأنشطة".

عمل سهل الإنشاء والنشر
في هذه المرحلة ، لدينا مشروع فارغ مترجم إلى .dll
. الآن دعنا ننتقل إلى إنشاء الإجراء نفسه.
ملاحظة: بما أن UiPath يدعم عدة لغات ، فسوف نحتاج في النهاية إلى إضافة الترجمة وتغيير ما نقوم به الآن قليلاً ، لكن لنبدأ بما هو ضروري وكافي.
- نحتاج إلى اثنين
using
:
using System; using System.Activities;
CodeActivity
من CodeActivity
:
public class TutorialForHabr: CodeActivity {}
- نضع المدخلات والمخرجات المعلمات:
public class TutorialForHabr: CodeActivity { public InArgument<Int32> Row { get; set; } public InArgument<Int32> Column { get; set; } public OutArgument<String> Cell { get; set; } }
معلمات الإجراء NB هي إدخال InArgument< >
، إخراج OutArgument< >
ومختلط ، مما يسمح لكلا تلقي وتلقي المعلمات InOutArgument< >
- وطريقة
Execute
، وهي الطريقة الوحيدة التي يجب أن نضعها بالتأكيد:
protected override void Execute(CodeActivityContext context) { string colstr = "";
في هذه المرحلة ، لدينا إجراء فعال لـ UiPath يقوم بتنفيذ وظائف بسيطة ولكنها ضرورية.
سننشره ، ثم ننتقل إلى الجزء الثاني ونأخذ "الزخارف" قليلاً.
نشر عبر NuGet
يمكنك إنشاء حزمة NuGet من خلال واجهة المستخدم الرسومية لـ NuGet Package Manager أو من خلال سطر الأوامر عن طريق استدعاء nuget.exe pack
. يقبل أمر pack
معلمتين رئيسيتين كإدخال: اسم ملف المشروع .csproj أو اسم الملف .nuspec الذي يحتوي على معلومات التعريف الخاصة بالحزمة. لا يسمح لنا الخيار الأول ، دون تعديلات يدوية إضافية لملف .json ، بتعيين بعض خصائص الحزمة المهمة بالنسبة لنا ، مثل العلامات أو الترخيص أو عنوان URL لمستودع التخزين ، بالإضافة إلى أنه لا يسمح لنا بتعيين رمز للمشروع الذي سيكون مرئيًا في مدير الحزمة.
في البديل الثاني ، نقوم بتكرار بعض خصائص الحزمة ، والتي ، على الرغم من ذلك ، يمكن الحصول عليها تلقائيًا من Visual Studio.
لذلك ، سوف نمضي في المسار 1.5 ، وننشئ ملفًا بالملحق .nuspec في جذر المشروع (لا يهم الاسم ، يوجد ملف واحد فقط من هذا القبيل) ، والذي سيحتوي على المعلومات التي لا يمكن الحصول عليها من .csproj ودمج هذين المصدرين للبيانات.
<?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>
كما ترون ، هيكل .nuspec واضح جدا. إذا كنت مترددًا في الفوضى باستخدام XML ، يمكنك إنشائه من خلال محرر مرئي NuGet Package Manager وحفظه في مجلد المشروع للاستخدام في المستقبل. تؤخذ متغيرات مثل $copyright
من المعلومات الواردة في ملف .dll ، أي من Visual Studio.
الآن نريد استخدام .nuspec بحيث نحصل على حزمة جديدة مع كل بنية. للقيام بذلك ، نذهب إلى "خصائص" ونذهب إلى علامة التبويب "إنشاء أحداث".
اكتب كلمات سحرية في سطر أوامر حدث ما بعد الإنشاء
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\"
والتي ، مترجمة إلى الروسية ، يعني
- احذف الحزم القديمة في المجلد حيث يتم إنشاء الإنشاء
- قم بإنشاء حزمة جديدة باستخدام ملفات .csproj و .nuspec
- ضعه في المجلد
C:\Program Files (x86)\UiPath\Studio\Packages\
ما هو هذا المجلد؟ هذا هو مستودع الحزمة المحلية التي يستخدمها UiPath Studio. بمجرد ظهور حزمة جديدة هناك ، ستكون متاحة تلقائيًا من خلال مدير الحزم وسيكون من الممكن إضافتها إلى عمليات الروبوت.

ملحوظة: يمكن تغيير المسار إلى المستودع المحلي من خلال إعدادات UiPath Studio بحيث يكون من المناسب نسخ الملفات هناك إذا كانت هناك مشكلة في الأذونات.

هذا كل شيء ، في الواقع ، تهانينا!
ملحوظة: يرجى ملاحظة أن سمارت ستوديو نفسها قد أنشأت فئة لأعمالنا ، وذلك باستخدام النقاط كمستويات تعشيش ، ووضع مسافات أمام الحروف الكبيرة باسم الإجراء.
سيكون الجزء التالي من المقالة حول "الجاذبية": حول كيفية إنشاء واجهة مرئية لإجراء ما ، وتعيين رمز وتعريب النصوص.
نقوم به على محمل الجد
سمات
من أجل عملنا ، الجزء الأول يكفي. لكنني أريد أن نكون قادرين على اختيار فئة ، لإظهار النصائح ، إلخ.
لهذا نحن بحاجة إلى سمات. هناك سمات مناسبة للإجراء نفسه وللمعلمات الخاصة به:
[Category (" , ")] [DisplayName (" ")] [Description (" ")]
وهناك تلك المعلمات المطلوبة فقط:
[RequiredArgument]
التعريب
لسوء الحظ ، هناك دقة واحدة ذات سمات: في النسخة الروسية من UiPath Studio ، تُترجم أيضًا أسماء فئات الإجراءات وفئات خصائصها. وفقًا لذلك ، إذا قمنا بتعيين السمة [Category("Input")]
لمعلمة الإدخال ، فسيتم عرضها بشكل صحيح في الإصدار باللغة الإنجليزية ، ولكن في النسخة الروسية ستندرج في فئة الإدخال منفصلة ، وليس في فئة الإدخال القياسية. ينطبق الأمر نفسه على الإجراءات ؛ في الإصدار الروسي ، يصبح تكامل التطبيقات تكامل التطبيق .
لذلك نحن بحاجة إلى نقل ثوابت النص إلى الموارد المعتمدة على اللغة واستخدامها من هناك.
للقيام بذلك ، قم بإنشاء ملف سحري Localization.cs يحتوي على وظائف لترجمة السمات
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; } } } }
سيسمح لنا باستبدال التصميم
[Category("Name")
في
[LocalizedCategory(nameof(Resources.CategoryName))]
لكي تنجح هذه الآلية ، يجب علينا:
- قم بإنشاء ملفات موارد للغات التي سنقوم بترجمتها ، في حالتنا ،
Resources.resx
و Resources.ru.resx
في مجلد " Resources
( إضافة -> عنصر جديد -> ملف المورد ). تأكد من أن قيمة Access Modifier للموارد في Public . - إضافة إلى ملف الإجراء الفصل
using IlyaK.UiPath.Activities.TutorialForHabr.Properties;
وضبط الفصل وجميع المعلمات مع السمات المناسبة
[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))] }
- لكي تقع المكتبة التي تحتوي على موارد روسية في حزمة NuGet ، تحتاج إلى إضافة سطر آخر إلى مجموعة الملفات في ملف .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>
المصمم
لجعل أعمالنا تبدو جميلة في العملية والسماح للمستخدمين بإدخال البيانات دون الزحف إلى الخصائص ، نحتاج إلى إضافة واجهة مستخدم. يتم ذلك من خلال ملف XAML ، والذي يمكن تحريره ، بمساعدة Visual Studio ، في واجهة خاصة ، ولكن لا يزال يتعين إصلاح جزء يدويًا. سأعطيك نموذجًا لبدء العمل ، ومن ثم فإن وثائق Microsoft تستحق البحث.
- ضع أيقونة الإجراء في مجلد
Resources
. في خصائص إجراء البناء الذي تم تعيينه إلى المورد (وليس الموارد المدمجة ) - إنشاء مصمم نشاط جديد ( إضافة -> عنصر جديد -> مصمم نشاط ) في مجلد "
Designer
واسمه 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>
هذه هي الطريقة التي وضعنا بها العلامة المترجمة:
<TextBlock Grid.Row="0" Grid.Column="0" Text="{x:Static resource:Resources.RowName}" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,0,5,0" />
، وهذا هو حقل الإدخال. يعين ExpressionType
نوع الحقل ، HintText
- تلميح (نص رمادي) له ، Expression
يربط قيمة الحقل بعملنا
<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}" />
ملحوظة: لاحظ علامة BitmapImage في نهاية الملف. لذلك قمنا بتعيين الصورة للرمز مع وجود رابط لملف المورد. هذه وظيفة هشة للغاية وفي بعض الأحيان يتعين عليك العبث بها.
وفقا للنتائج يجب أن تتحول مثل هذا:

- إنشاء فئة DesignerMetata في مجلد "الأنشطة"
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()); } } }
- تشغيل البناء
- وتحديث الحزمة في UiPath Studio.
ملحوظة: لكي يعمل هذا من أجلك ، من الضروري أن يختلف إصدار الحزمة الجديدة عن الإصدار القديم. أسهل طريقة للقيام بذلك هي مع بعض المكونات الإضافية لبرنامج Visual Studio ، مثل Build Build Increment Add-In . أو قم بتحديث الإصدار يدويًا.
في ما يلي العرض النهائي لعملنا ، مع وجود أيقونة وحقول إدخال:

استنتاج
آمل أن أتمكن من إظهار أن إنشاء إجراءات مؤطرة بالكامل لـ UiPath لم يمض وقت طويل. أود حقًا أن تكون هذه المقالة مفيدة لك وأن تكون بداية جيدة لكتابة أنشطة جديدة ورائعة لـ UiPath. وعند إنشائه - لا تنس نشره على UiPath Go!
مواد إضافية