UiPathのカスタムアクティビティの配置場所について(アクティビティ開発者・UiPath開発者・Robot向け)

これまで数回 UiPathのカスタムアクティビティを作成してきて、その作成したカスタムアクティビティを社内で共有しようと思ったとき、どのように共有するのがよりよいかをあらためて考えてみました。


## 全体像
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/77d191ce-512a-606a-db2b-30b51c7f1671.png)

このように「Visual Studioでアクティビティを開発するヒト」と「UiPath Studioで、そのアクティビティを使ったUiPathのシナリオを開発するヒト」そして「そのシナリオをRobotから使うヒト」がいるわけですね。


今回はこれら3つのアクターがカスタムアクティビティのnupkg を共有するために、今回は、.NET系のヒトたちがライブラリを共有するためのサイト、https://www.nuget.org/ を使用してみました。JavaでいうMavenのセントラルリポジトリみたいなもんですね。


## 全体像(NuGetサイト追記)

NuGetサーバ( https://www.nuget.org/ )を追記した全体像は以下の通り。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/45522d91-8ace-5710-a161-cea9802c8bf3.png)


## Visual Studioでアクティビティを開発するヒト
図中の上のヒトです。カスタムアクティビティをVisual Studioで開発しながらUiPath Studioでデバッグしている工程では、NuGet のサイトを用いるのではなく単純に、Visual Studio(正確にはnuget.exe)がnupkgを配置する場所をUiPath Studioが参照すればよいわけですね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/b88880f1-912b-7fa0-6ea5-d1508cce5b4a.png)
この場合は、Visual Studio の パッケージマネージャ設定 で、ローカルのnupkgが出力されるパスを指定すればUiPath Studioもそこを参照してくれる、ようになっているのでした。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/6752a1e9-748a-ce40-e385-ac886923fdca.png)


参考:[パッケージマネージャのローカルリポジトリの追加](https://qiita.com/masatomix/items/1f63513e80313a99faeb#%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%81%AE%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E8%BF%BD%E5%8A%A0)

したがってカスタムアクティビティの開発者はこれで十分ですが、他のアクターとのnupkgの共有のために、リリースしたいnupkgを NuGetのサイトに公開します。

### NuGetサイトへnupkgを公開する
NuGetサイトでのnupkg公開には、NuGetサイトのアカウントの作成と、そのアカウントでnupkgをアップロードする際に必要なAPIキーが必要です。

やってみます。https://www.nuget.org/ へアクセスし、右上の「Sign in」を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/4706c948-de1c-4d1c-4e20-56f3bddf488f.png)

下図ではMicrosoftアカウントでログインしようとしていますが、まあ、何でもイイのでアカウントを作成してください
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/1ac1cdce-1698-2351-e476-4d999778cbba.png)

アカウントを作成したら、右上部分から 「API Keys」を選択してAPI キーの管理画面に遷移します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/7de102c1-bd29-eaa1-f5c9-49797f6d6a80.png)

Createを選ぶと、キーを作成する画面になります。

キーの名前や、そのキーで出来ること(packagesのPushができればじゅうぶん)、Globパタンで「*」(どのパッケージもアップできるって意味。制限することも可能) などを記述して、Create ボタンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/dd11e41d-39db-5444-14fd-6f7973a8cec1.png)

キーが作成できました。このキーは、いま、この画面でしかコピペできないので、どこかにひかえておきましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/e508ca5d-5270-a044-efff-aaba54cd4ffb.png)


早速アップロードしてみましょう。カスタムアクティビティはまあ何でもよいんですが、ずっと[記事に使ってるカスタムアクティビティ](https://github.com/masatomix/UiPath_Path) を使用します。

NuGetサイトへのアップロードは、nupkgファイルのある場所に移動して、下記のコマンドで行います。

```
Z:\git\Path\Utils> dotnet nuget push kino.UiPath.Utils.Activities.0.1.30.nupkg 
                     -k [取得したAPIキー] 
                     -s https://api.nuget.org/v3/index.json    (実際は一行で)
info : kino.UiPath.Utils.Activities.0.1.30.nupkg を 'https://www.nuget.org/api/v2/package' にプッシュしています...
info :   PUT https://www.nuget.org/api/v2/package/
info :   Created https://www.nuget.org/api/v2/package/ 12900 ミリ秒
info : パッケージがプッシュされました。
```

うまくいったようです。アップが完了するとほどなくして(10〜30分くらい？？結構かかる)、NuGetのサイトの Manage packages画面で、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/44ba7efc-a001-2d9c-56af-221cb52ab9a0.png)

こんな感じに確認することが可能です。

検索も可能になってるはずです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/e4faaa19-45e9-6737-2741-94391030767a.png)



以上でアップロードは完了しました。改めて図示するとこんな感じですね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/67b9ccf1-f6f1-f7ff-2749-bb7f391dd616.png)


## UiPath Studioで、そのアクティビティを使ったUiPathのシナリオを開発するヒト
つづいて、UiPath Studioでカスタムアクティビティをつかったシナリオを開発するヒトです。このアクターは、UiPath Studioが直接 NuGetサイトのフィードを参照してくれれば良いのですが、直接は参照してくれないっぽい[^1]ので、https://www.nuget.org/ よりnupkgをローカルにダウンロードし、それが展開される場所を UiPath Studioが参照するようにします。

具体的には以下の通り。

まずはNuGetサイトからのGetですが、任意のディレクトリで、下記のコマンドを使用します

```
C:\Temp> nuget install kino.UiPath.Utils.Activities -Source https://api.nuget.org/v3/index.json
Feeds used:
  https://api.nuget.org/v3/index.json

Installing package 'kino.UiPath.Utils.Activities' to 'c:\Temp'.
  GET https://api.nuget.org/v3/registration3-gz-semver2/kino.uipath.utils.activities/index.json
  OK https://api.nuget.org/v3/registration3-gz-semver2/kino.uipath.utils.activities/index.json 675ms
... 割愛

Successfully installed 'kino.UiPath.Utils.Activities 0.1.30' to c:\Temp
Executing nuget actions took 1.72 sec

c:\Temp>
```

こうすると、 `c:\Temp>` にnupkgが配置されると同時に
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/f27c7f06-9fbd-6baf-e005-18647433d973.png)

`C:\Users\ユーザ名\.nuget\packages` にも、nupkgが展開されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/71720b66-4747-c3b1-8356-56b251cc4529.png)

実は`C:\Users\ユーザ名\.nuget\packages`こちらのディレクトリは、次のアクターのRobotも参照している場所のようなので、UiPath Studioにはこのディレクトリを参照するよう設定します。

UiPath Studio >> Activitiesペインの Manage Packages(段ボールアイコン) >> 右クリックで Configure Sources を選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/535e5f59-8cc4-f8e9-4ac1-7c0b95a361c9.png)

追加(プラス)アイコンをクリックして、`C:\Users\ユーザ名\.nuget\packages` を参照先として追加してOKをクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/7d208da6-669d-090f-8976-544360db7979.png)

Package管理画面から、ローカルに展開されたカスタムアクティビティを参照できるようになりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/d38a1afb-0bc8-949a-83ef-270883264f8e.png)


改めて図示するとこんな感じです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/b4425f95-ee69-21b3-0143-8da3ad9409b6.png)


今後NuGetサイト上のカスタムアクティビティが更新されたばあいは 再度 `nuget install` コマンドでローカルのファイルを更新して、それからPackage管理画面を開いてください。そこからUpdateすることが可能です。




## カスタムアクティビティとそのシナリオをRobotから使うヒト
さて最後は「カスタムアクティビティとそのシナリオをRobotから使うヒト」です。さきほど少し書きましたが、`C:\Users\ユーザ名\.nuget\packages` はUiPath Robotがデフォルトで参照しているディレクトリでした。従って「アクティビティを使ったUiPathのシナリオを開発するヒト」と同様、NuGetサイトから nupkgをダウンロードして、展開しておくだけで良さそうです。手順は同じで、任意のディレクトリで下記のコマンドを実行します。

```
C:\Temp> nuget install kino.UiPath.Utils.Activities -Source https://api.nuget.org/v3/index.json
```

図示するとこう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/abcc24c6-f8e8-13a5-8062-0a3bedbc2b61.png)
参考：[UiPathのカスタムアクティビティの配布について(Orchestrator接続なし版)](https://qiita.com/masatomix/items/9206873c2959451ac01e#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%93%E3%83%86%E3%82%A3%E3%81%AE%E9%85%8D%E7%BD%AE%E5%A0%B4%E6%89%80)



UiPathのnupkgについては、Orchestratorナシの場合は手動でローカルの所定の場所へ、OrchestratorアリのばあいはOrchestratorから配布してもらいましょう。




##まとめると

おつかれさまでした。

カスタムアクティビティのnupkgをどう取得・配置すればよいかについて整理しました。まとめると

- 「Visual Studioでアクティビティを開発するヒト」→ 開発時は、Visual/UiPath Studio がローカルでnupkgを共有する。配布はNuGetサイトへ
- 「UiPath Studioで、そのアクティビティを使ったUiPathのシナリオを開発するヒト」→nuget.exeでnupkgをinstallしたのち、UiPath Studioが、所定のディレクトリ`C:\Users\ユーザ名\.nuget\packages`を参照する
- 「そのシナリオをRobotから使うヒト」→nuget.exeでnupkgをinstall すれば、Robotが参照している場所に自動的に展開される

という事になりそうです。今回はネット上のNuGetサーバを用いましたが、社内開発みたいな公開したくないアクティビティはイントラ内にNuGetのサーバを構築すればイイってことですかね。



そういえば、[UiPathのカスタムアクティビティの配布について(Orchestrator接続あり版)](https://qiita.com/masatomix/items/af71fa799d53d3cbc08a) でOrchestratorに接続したロボについて書きましたが、そのパタンではOrchestratorサーバ自体がNuGetサーバになって、Robotはそこからカスタムアクティビティを取得しました。仕組みとしては近しい感じです。。


ちなみに、UiPath Studio 2018.3からは、Package管理画面 に  https://www.nuget.org/ が設定されているようなので、UiPath Studio 開発者はカスタムアクティビティの取得が少しは楽になりそうですね。(ロボットが https://www.nuget.org/ を参照してて自動ダウンロードしてくれるかは未確認。。)

**2018/10/19追記**
https://www.nuget.org/ が設定されている、と書きましたが正確には自分で追加したのかも、、、。しかも追加したURLは https://api.nuget.org/v3/index.json でした。ただ、2018.2系ではこのURLの追加は出来なくて(エラーになる)、2018.3系から直接参照できる、ってのは変わりません。。

**2018/10/19追記 ここまで**



[^1]: **2018/11/12追記** うえにも少し書きましたが、UiPath Studioの2018.3からは、NuGetのプロトコルをそのまま読めるようになった(?)みたいで、Orchestratorに繋いだStudioは、OrchにデプロイしたカスタムアクティビティをStudio上で直接取得できるようになりました。Orchに接続しているロボは直接Orchのフィードを受けていましたが、それと同様の挙動になったって事ですね。さらには、[UiPathのカスタムアクティビティの配布について(Orchestrator接続あり版)](https://qiita.com/masatomix/items/af71fa799d53d3cbc08a#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%93%E3%83%86%E3%82%A3%E3%81%AEorchestrator%E3%81%B8%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89) では、コマンドを使ってカスタムアクティビティをOrchestratorにデプロイしましたが、2018.3のOrchからはアップロードするGUIが追加されましたね、、。(メニューにライブラリという欄が追加されました。)




## ソース
- https://github.com/masatomix/UiPath_Path ソース自体はこちら
- https://www.nuget.org/packages/kino.UiPath.Utils.Activities/ リリースしたカスタムアクティビティはこちら。



##関連リンク

- [Installing private NuGet packages](https://gemfury.com/help/nuget-server/) nuget install コマンド調査時に参考にさせていただきました。


## 記事目次
- [UiPath Studioで使用するカスタムアクティビティの作成方法](https://qiita.com/masatomix/items/1f63513e80313a99faeb)
- [UiPath Studioで使用するカスタムアクティビティの作成方法 つづき(GUI構築)](https://qiita.com/masatomix/items/e75598f73b0e019044ac)
- [UiPathのカスタムアクティビティの配布について(Orchestrator接続なし版)](https://qiita.com/masatomix/items/9206873c2959451ac01e) ロボがカスタムアクティビティを参照するまで。今回はさらにその共有をNuGetでやってみました
- [UiPathのカスタムアクティビティの配布について(Orchestrator接続あり版)](https://qiita.com/masatomix/items/af71fa799d53d3cbc08a) ロボがカスタムアクティビティをOrchestratorから取得する件。このケースは今回調べた件の派生パタンだったのね
- [UiPathのカスタムアクティビティの配置場所について(アクティビティ開発者・UiPath開発者・Robot向け)] (https://qiita.com/masatomix/items/b8988fcc2bd7046825f2) 今回の記事
- https://github.com/masatomix/UiPath_Path ソースのMaster Branch