# AddAndRemove(string[], string[], bool)

> Adds package dependencies to the project and removes package dependencies from the project. Requesting different dependencies often leads to changing installed packages, but only after the Package Manager constructs a dependency graph to solve any version conflicts. For more information, see Dependency and resolution. Calling this function is much more efficient than calling the Client.Add and Client.Remove functions several times because for this function, the Package Manager only has to solve the dependency list once, instead of constructing a new dependency graph after each call.

## Definition

* **Type:** Method
* **Namespace:** [UnityEditor.PackageManager](/engine/6000.5/script-reference/unityeditor/packagemanager.md)
* **Assembly:** UnityEditor.CoreModule

```csharp
public static AddAndRemoveRequest AddAndRemove(string[] packagesToAdd = null, string[] packagesToRemove = null, bool dryRun = false)
```

### Parameters

**** (\[string\[]]\(https\://learn.microsoft.com/dotnet/api/system.string)): An array of strings representing the package(s) to be added:- To install a specific version of a package, use a package identifier ("name\@version"). This is the only way to install a [pre-release](/engine/6000.5/manual/packages-list/packages-all/pack-preview.md) version.

- To install the latest compatible ([released](/engine/6000.5/manual/packages-list/packages-all/pack-safe.md)) version of a package, specify only the package [name](/engine/6000.5/manual/packages-list/cus-pkg-lp/cus-pkg-development/cus-pkg-manifest/upm-manifest-pkg.md).

- To install a git package, specify a [git url](/engine/6000.5/manual/packages-list/upm-git-dependencies/upm-git.md).

- To install a [local](/engine/6000.5/manual/packages-list/dependencies-lp/upm-localpath.md) package, specify a value in the format "file:/path/to/package/folder".

- To install a [local tarball](/engine/6000.5/manual/packages-list/dependencies-lp/upm-localpath.md) package, specify a value in the format "file:/path/to/package-file.tgz".`ArgumentException` is thrown if `packagesToAdd` contains `null` or empty values.**** (\[string\[]]\(https\://learn.microsoft.com/dotnet/api/system.string)): An array of strings representing the names of package(s) to be removed.`ArgumentException` is thrown if `packagesToRemove` contains `null` or empty values.**** (\[bool]\(https\://learn.microsoft.com/dotnet/api/system.boolean)): When `false` (default), the add and remove operations are applied to your project. When `dryRun` is `true`, the Package Manager calculates its changes to the final package state without actually modifying the project. This is useful for validation or to show what changes will be made before applying them.

### Returns

| Type                                                                                                              | Description                                                                                                                                                                                                                                                                                                                                                                            |
| ----------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [AddAndRemoveRequest](/engine/6000.5/script-reference/unityeditor/packagemanager/requests/addandremoverequest.md) | An [AddAndRemoveRequest](/engine/6000.5/script-reference/unityeditor/packagemanager/requests/addandremoverequest.md) instance, which you can use to get the [PackageCollection](/engine/6000.5/script-reference/unityeditor/packagemanager/packagecollection.md) representing the package that were added and removed from the project from the `AddAndRemoveRequest.Result` property. |

### Remarks

`ArgumentException` is thrown if both `packagesToAdd` and `packagesToRemove` are `null` or empty.

`AddAndRemove()` is an asynchronous operation. Before the operation is complete, you can use the `AddAndRemoveRequest` instance to monitor the asynchronous operation.

**Note:** Make sure any other Client operations have completed before calling this method. For more information, see the note on the [Client](/engine/6000.5/script-reference/unityeditor/packagemanager/client.md) class reference page.

**Dry run behavior:** When `dryRun` is `true`, the Package Manager calculates what the final package state would be without actually modifying the project. This is useful for validation or to show users what changes would be made before applying them. The resulting [PackageCollection](/engine/6000.5/script-reference/unityeditor/packagemanager/packagecollection.md) represents the simulated final state.
