Version: 2020.2
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 manifestEach package has a manifest, which provides information about the package to the Package Manager. The manifest contains information such as the name of the package, its version, a description for users, dependencies on other packages (if any), and other details. More info
See in Glossary
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;
           }
       }
   }
}

Embedding a package in the project

This example demonstrates how to use the Client class to embed one of the packages already installed in your project. The main method is the Client.Embed method, which makes a copy of the package and stores it under the Packages folder of your project.

The Client.Embed method returns an EmbedRequest instance, which you can use to get the status of the Embed operation, any errors, or a Request response that contains the PackageInfo information for the newly embedded package
See in Glossary
.

This example also uses the Client.List method to access the collection of packages currently installed in your project and picks out the first one that is neither embedded nor built-in.

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 System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.PackageManager.Requests;
using UnityEditor.PackageManager;
using UnityEngine;

namespace Unity.Editor.Example
{
    static class EmbedPackageExample
    {
        static String targetPackage;
        static EmbedRequest Request;
        static ListRequest LRequest;

        [MenuItem("Window/Embed Package Example")]
        static void GetPackageName()
        {
            // First get the name of an installed package
            LRequest = Client.List();
            EditorApplication.update += LProgress;
        }

        static void LProgress()
        {
            if (LRequest.IsCompleted)
            {
                if (LRequest.Status == StatusCode.Success)
                {
                    foreach (var package in LRequest.Result)
                    {
                        // Only retrieve packages that are currently installed in the
                        // project (and are neither Built-In nor already Embedded)
                        if (package.isDirectDependency && package.source
                            != PackageSource.BuiltIn && package.source
                            != PackageSource.Embedded)
                        {
                            targetPackage = package.name;
                            break;
                        }
                    }

                }
                else
                    Debug.Log(LRequest.Error.message);

                EditorApplication.update -= LProgress;

                Embed(targetPackage);

            }
        }

        static void Embed(string inTarget)
        {
            // Embed a package in the project
            Debug.Log("Embed('" + inTarget + "') called");
            Request = Client.Embed(inTarget);
            EditorApplication.update += Progress;

        }

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

                EditorApplication.update -= Progress;
            }
        }
    }
}


Package Manifest window
Accessing package assets