Version: 2019.1
Package Manifest window
Accessing package Assets

Scripting API for packages

You can use the Package Manager scripting API to interact with the Package Manager programmatically. For example, you might want to install a specific package or version depending on the platform of the target machine.

At the heart of the system is the PackageManager.Client class which you can use to find packages, browse the list of packages, and install and uninstall packages through scripting.

Another important class is PackageManager.PackageInfo, which contains the state of a package, including metadata obtained from the package manifest and the registry. For example, you can get a list of versions available for the package, or the list of any errors that might occur while locating or installing the package.

Adding a package to the Project

This example demonstrates how to use the Client class to install or add a package to the Project.

You can specify either the package name, or the name with a specific version when calling the Client.Add method. For example, using Client.Add("com.unity.textmeshpro@1.3.0") installs version 1.3.0 of the TextMesh Pro package, but using only Client.Add("com.unity.textmeshpro") installs (or updates to) the latest version of the package.

The Client.Add method returns an AddRequest instance, which you can use to get the status, any errors, or a Request response that contains the PackageInfo information for the newly added package.

using System;
using UnityEditor;
using UnityEditor.PackageManager.Requests;
using UnityEditor.PackageManager;
using UnityEngine;

namespace Unity.Editor.Example {
   static class AddPackageExample
   {
       static AddRequest Request;
      
       [MenuItem("Window/Add Package Example")]
       static void Add()
       {
           // Add a package to the Project
           Request = Client.Add("com.unity.textmeshpro");
           EditorApplication.update += Progress;
       }

       static void Progress()
       {
           if (Request.IsCompleted)
           {
               if (Request.Status == StatusCode.Success)
                   Debug.Log("Installed: " + Request.Result.packageId);
               else if (Request.Status >= StatusCode.Failure)
                   Debug.Log(Request.Error.message);

               EditorApplication.update -= Progress;
           }
       }
   }
}

Browsing the list of packages in a Project

This example demonstrates how to use the Client class to iterate over the packages in the Project.

The Client.List method returns a ListRequest instance, which you can use to get the status of the List operation, any errors, or a Request response that contains the PackageCollection which you can iterate.

using System;
using UnityEditor;
using UnityEditor.PackageManager.Requests;
using UnityEditor.PackageManager;
using UnityEngine;

namespace Unity.Editor.Example {
   static class ListPackageExample
   {
       static ListRequest Request;
    
       [MenuItem("Window/List Package Example")]
       static void List()
       {
           Request = Client.List();    // List packages installed for the Project
           EditorApplication.update += Progress;
       }

       static void Progress()
       {
           if (Request.IsCompleted)
           {
               if (Request.Status == StatusCode.Success)
                   foreach (var package in Request.Result)
                       Debug.Log("Package name: " + package.name);
               else if (Request.Status >= StatusCode.Failure)
                   Debug.Log(Request.Error.message);

               EditorApplication.update -= Progress;
           }
       }
   }
}
Package Manifest window
Accessing package Assets