{"id":18346621,"url":"https://github.com/modesttree/projeny","last_synced_at":"2025-04-04T20:14:50.574Z","repository":{"id":48126658,"uuid":"48297632","full_name":"modesttree/Projeny","owner":"modesttree","description":"A project and package manager for Unity","archived":false,"fork":false,"pushed_at":"2019-02-05T17:19:30.000Z","size":5758,"stargazers_count":695,"open_issues_count":54,"forks_count":81,"subscribers_count":64,"default_branch":"master","last_synced_at":"2025-03-28T19:08:24.123Z","etag":null,"topics":["dependency","dependency-manager","management","manager","organization","package","package-manager","project","project-management","unity3d"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/modesttree.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"License.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-12-19T21:23:34.000Z","updated_at":"2025-03-06T13:41:01.000Z","dependencies_parsed_at":"2022-08-12T19:10:34.125Z","dependency_job_id":null,"html_url":"https://github.com/modesttree/Projeny","commit_stats":null,"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/modesttree%2FProjeny","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/modesttree%2FProjeny/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/modesttree%2FProjeny/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/modesttree%2FProjeny/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/modesttree","download_url":"https://codeload.github.com/modesttree/Projeny/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247242680,"owners_count":20907134,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dependency","dependency-manager","management","manager","organization","package","package-manager","project","project-management","unity3d"],"created_at":"2024-11-05T21:11:57.963Z","updated_at":"2025-04-04T20:14:50.550Z","avatar_url":"https://github.com/modesttree.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\u003cimg src=\"Docs/LogoWhiteWithText.png?raw=true\" alt=\"Projeny\" width=\"250px\" height=\"246px\"/\u003e\n\n## Project and Package Manager for Unity3D\n\n[![Join the chat at https://gitter.im/Projeny/Lobby](https://badges.gitter.im/Projeny/Lobby.svg)](https://gitter.im/Projeny/Lobby?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n\n### \u003ca id=\"introduction\"\u003e\u003c/a\u003eIntroduction ###\n\nThe purpose of Projeny is to allow your Unity3D project to easily scale in size without heavily impacting development time.\n\nProjeny allows you to:\n\n* Share any Unity assets (code, scenes, prefabs, etc.) across multiple different Unity projects without copy and pasting\n* Instantly switch between platforms\n* Easily upgrade or downgrade installed asset store packages\n* Optimize compile time of your project by getting Unity to only recompile the code that changes most often\n* Split up your project into discrete packages, so that you can manage the dependencies between each, instead of having one giant Unity project of inter-related files\n* Declare dependencies between packages, so that you always get the packages that you need without needing to hunt down missing libraries or broken links\n* Generate a more intelligent Visual Studio solution than the Unity default, using package dependencies to create csproj dependencies\n\nSee below for details on how Projeny achieves all these features.\n\nThis project is open source.  If you're interested in helping, great!  There's still a number of features we'd like to support eventually (in particular we need help with supporting OSX).\n\nNOTE: Projeny requires Unity3D 5.3.1 or higher, since it makes use of the `-buildTarget` command line switch is only fixed in 5.3.1\n\n## Table Of Contents\n\n* \u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e\n* \u003ca href=\"#overview\"\u003eOverview\u003c/a\u003e\n* \u003ca href=\"#advantages\"\u003eAdvantages of Using Projeny\u003c/a\u003e\n    1. \u003ca href=\"#shared-files\"\u003eShared files between projects\u003c/a\u003e\n    2. \u003ca href=\"#organization\"\u003ePackage Organization and Asset Store integration\u003c/a\u003e\n    3. \u003ca href=\"#platform-switching\"\u003eNear instant platform switching\u003c/a\u003e\n    4. \u003ca href=\"#compilation-time-optimization\"\u003eCompile time optimization\u003c/a\u003e\n    5. \u003ca href=\"#platform-specific-folders\"\u003ePlatform specific package folders\u003c/a\u003e\n    6. \u003ca href=\"#dependency-management\"\u003eDependency Management of Packages\u003c/a\u003e\n    7. \u003ca href=\"#visual-studio-generation\"\u003eMore intelligent Visual Studio Solution generation\u003c/a\u003e\n* Usage Details\n    * \u003ca href=\"#managing-assetstore-assets\"\u003eManaging Asset Store Assets / Releases\u003c/a\u003e\n    * \u003ca href=\"#multiplepackagefolders\"\u003eUsing Multiple Package Folders\u003c/a\u003e\n    * \u003ca href=\"#shareprojectsettings\"\u003eSharing Project Settings\u003c/a\u003e\n    * \u003ca href=\"#directorylinksgotchas\"\u003eGotchas With Directory Links\u003c/a\u003e\n    * \u003ca href=\"#faq\"\u003eFrequently Asked Questions\u003c/a\u003e\n        * \u003ca href=\"#workflow-create-package\"\u003eHow do I create a new package?\u003c/a\u003e\n        * \u003ca href=\"#workflow-create-project\"\u003eHow do I create a new project?\u003c/a\u003e\n        * \u003ca href=\"#workflow-create-new-config\"\u003eHow do I start an entirely new set of Projeny-based project from scratch?\u003c/a\u003e\n        * \u003ca href=\"#standardassets\"\u003eHow do I import Unity's Standard Assets?\u003c/a\u003e\n    * Configuration Files\n        * \u003ca href=\"#projeny-yaml\"\u003eProjeny.yaml reference\u003c/a\u003e\n        * \u003ca href=\"#project-yaml\"\u003eProjenyProject.yaml reference\u003c/a\u003e\n        * \u003ca href=\"#package-yaml\"\u003eProjenyPackage.yaml reference\u003c/a\u003e\n    * \u003ca href=\"#custom-release-registries\"\u003eCustom Release Sources\u003c/a\u003e\n    * \u003ca href=\"#command-line-reference\"\u003eCommand Line Reference\u003c/a\u003e\n* \u003ca href=\"#appendix\"\u003eAppendix\u003c/a\u003e\n    * \u003ca href=\"#dllgotchas\"\u003eA. \"Gotchas\" with using external assemblies:\u003c/a\u003e\n* \u003ca href=\"#release-notes\"\u003eRelease Notes\u003c/a\u003e\n* \u003ca href=\"#license\"\u003eLicense\u003c/a\u003e\n\n## \u003ca id=\"installation\"\u003e\u003c/a\u003eInstallation\n\nYou can either run Projeny directly from source (requires python) or simply download the latest binary.  Note that Projeny is currently only supported on Windows (with an OSX version planned for future releases).\n\n- From Binary\n\n    - Go to the [releases](https://github.com/modesttree/projeny/releases) section and download the latest ProjenyInstaller.exe\n    - Note that after installation completes, you will need to add the [Install Directory]/Bin directory to your windows path.\n\n- From Source\n\n    - Clone this repo to a place on your hard drive\n    - Make sure python 3.x is installed and that you have also installed the following:\n        - pyyaml (to install run `pip install pyyaml`)\n        - python for windows extensions (download [here](https://sourceforge.net/projects/pywin32/) for your version of python)\n    - Open UnityPlugin/Projeny.sln in Visual Studio\n    - Build in Release Mode\n    - Add the Projeny/Source/bin folder to your windows path\n\n## \u003ca id=\"overview\"\u003e\u003c/a\u003eOverview\n\nProjeny works by composing your Unity3D projects entirely out of 'directory links' (aka windows junctions aka symbolic links).\n\nThis is best shown with an example.  After installing Projeny, [download the sample project](https://github.com/modesttree/projeny/releases) from the releases page and extract it to a new folder on your hard drive.  The folder structure should appear like this:\n\n* Projeny.yaml\n* UnityPackages\n    * AllMovers\n    * CommonShapeMover\n    * CubeMover\n    * SphereMover\n* UnityProjects\n    * ProjenyProject.yaml\n    * AllMovers\n        * ProjenyProject.yaml\n        * ProjectSettings\n    * CubeMover\n        * ProjenyProject.yaml\n        * ProjectSettings\n    * SphereMover\n        * ProjenyProject.yaml\n        * ProjectSettings\n\nEach folder in the `UnityProjects` directory represents an actual Unity3D project.  Note that they each have the familiar `ProjectSettings` directory but they do not yet have an `Assets` directory.  This is because these projects have not been initialized yet by Projeny.  You'll also notice a file named `Projeny.yaml` at the root of the folder structure.  This is a simple text file that is used to specify configuration settings for Projeny.\n\nTo initialize these Unity projects we must run Projeny from the command line.  Open up command prompt or powershell and navigate to the root directory (the same directory where you will find `Projeny.yaml`).  Then execute `prj --init`.  If the prj command is not found, check that it has been added to your windows PATH variable, as mentioned in the \u003ca href=\"#installation\"\u003einstall instructions\u003c/a\u003e.  All this command does is initialize some of the the directory links for these projects.\n\nIf we look at our project folders again, we see that a bunch of new folders appear to have been added.  Let's look at the `CubeMover` project in particular:\n\n* UnityProjects\n    * CubeMover\n        * ProjectSettings\n        * CubeMover-Windows\n            * Assets\n                * CubeMover\n                * Plugins\n                    * CommonShapeMover\n                    * Projeny\n            * ProjectSettings\n\nThe `CubeMover-Windows` folder is new, and now has the familiar `Assets` directory.  It also contains a bunch of folders within it such as `CubeMover`, `CommonShapeMover`, etc.\n\nTo actually run our project, open the `CubeMover-Windows` folder in Unity and then open the scene at `CubeMover/CubeMain`.  After running it you should see the cube move around while changing colors.\n\nSo where did all these files come from?  The answer is 'directory links' (aka windows junctions aka symbolic links).  All of these new folders are not really folders in themselves but instead they are simply links to existing folders somewhere else.\n\nIn fact, if you're using source control, the entire `CubeMover-Windows` directory should be excluded from it (by using a `.gitignore` file, a `.svnignore`, `.p4ignore`, or whatever ignore method applies to the source control you're using).  If you're using subversion or git, this will happen automatically when you initialize your project (otherwise, you will have to make sure to add the ignore files yourself).\n\nWe do this because the contents of the `CubeMover-Windows` folder does not itself contain any real content.  It simply contains temporary files generated by Unity (such as the Library folder) and directory links to other directories that actually do contain content.\n\nThe directories containing the actual content can be found in the `UnityPackages` directory.  This is where you will find the `CubeMover` and `CommonShapeMover` folders that we see linked to underneath the assets directory.\n\nBut how does Projeny know which packages to use for the `CubeMover` project?  For this it reads from a configuration text file, which can be found at `CubeMover/ProjenyProject.yaml`.  Details on this file are covered in another section below.  This file can be changed by hand, but most of the time however you can use Projeny's built-in Unity plugin to manipulate this file instead.  You can try this by opening the `CubeMover` project in Unity, then clicking the menu item `Projeny -\u003e Package Manager...`.  This window will be be explained in more detail in the following sections.\n\n## \u003ca id=\"advantages\"\u003e\u003c/a\u003eAdvantages of Using Projeny\n\nOk so why are we doing this?  Why go to the trouble of creating this seemingly complex directory structure of for every project?  What's wrong with the standard way that Unity is designed?\n\nWe do this because it has many advantages over standard Unity development:\n\n### \u003ca id=\"shared-files\"\u003e\u003c/a\u003e1 - Shared files between projects\n\nBy using directory links, you can have multiple Unity projects all using the same package folders, without needing to copy and paste each package per project.  You can change a file such as a prefab or a C# file, and that change will be applied to all other projects that are using it as well\n\nPreviously, the best way to share code between different Unity projects was to put the code into a DLL and then output that DLL to all the Unity Projects that you want to use it in.  This works ok but has a number of \u003ca href=\"#dllgotchas\"\u003egotchas\u003c/a\u003e that make this approach difficult to do correctly.\n\nWant to re-use some common utility code/prefabs in several different games?   Just have multiple Unity projects for each game all using the same utility packages directly.\n\nWant to just test one part of your game without needing to fire up the entire project?  Just create another Unity project and reference only the parts of the game you want to test.\n\nTo see this in action, do the following: (Note: this assumes you have already run `prj --init` as described above)\n* Open Unity then open the project at `UnityProjects/SphereMover/SphereMover-Windows`\n* Open another copy of Unity then open the project at `UnityProjects/CubeMover/CubeMover-Windows`\n* Open the scene named `SphereMain` in the first Unity and the scene `CubeMain` in the second Unity\n* If you run them you should see the shapes move and change colors\n* The script used here to move both the Sphere and the Cube is the same, and can be found in the shared package `CommonShapeMover`.\n* As a further example, open up the Unity project at `UnityProjects/AllMovers/AllMovers-Windows`\n* Run the scene `AllMovers`\n* You should see both the cube and sphere in the same scene\n* This works because these three projects all have some shared packages.  Note that this allows sharing code as well prefabs (ie. the cube and the sphere prefabs), scenes, etc.\n\n### \u003ca id=\"organization\"\u003e\u003c/a\u003e2 - Package Organization and Asset Store Integration\n\nProjeny allows you to much more easily manage many different Unity packages that you've created yourself, but also those packages that you've installed through the asset store. \n\nYou can build up a big collection of packages that you've purchased through the asset store and added to your `UnityPackages` directory, and then easily include or exclude those by simply selecting or not selecting them for each project.  Projeny can also be used to easily upgrade/downgrade installed asset store packages all through a simple interface within Unity.  See \u003ca href=\"#managing-assetstore-assets\"\u003ethis section\u003c/a\u003e for more details on managing asset store packages through Projeny.\n\n### \u003ca id=\"platform-switching\"\u003e\u003c/a\u003e3 - Near instant platform switching\n\nYou might be wondering why the projects that you've been dealing with are all marked with the suffix '-Windows'.  Or why there are multiple `ProjectSettings` folders that appear after you run the `--init` command as described above (One underneath `CubeMover` and another underneath `CubeMover-Windows`)\n\nThe reason for this is to allow Projeny to create entirely separate Unity project directories for each platform.  This allows us to jump instantly from one platform to another without needing to wait for Unity to process all the assets.\n\nIn the examples above, we have only initialized the windows Unity project `CubeMover-Windows` but we can also create `CubeMover-iOS`, `CubeMover-Android`, etc. by opening these platforms for this project.\n\nWhen that occurs, Projeny will create a directory link to the main `ProjectSettings` directory so that we can have all these different platform-specific projects use the same Unity project settings.\n\nTo see this in action, open up the `CubeMover` project in Unity then select the menu item `Projeny -\u003e Change Platform -\u003e iOS`.  The first time you do this will take longer since Unity has to process the files but any subsequent times should be nearly instant, since it should be no different from simply opening another project.\n\n### \u003ca id=\"compilation-time-optimization\"\u003e\u003c/a\u003e4 - Compile time optimization\n\nUnity compiles your project in multiple passes.  The first pass compiles all C# files that are in the `Plugins/` directory and the second pass compiles all other C# files.  If Unity does not detect any changes in the `Plugins/` directory then Unity will skip this first pass and only execute the second pass.  (Note: This is a bit of a simplification - see [here](http://docs.unity3d.com/Manual/ScriptCompileOrderFolders.html) for full details)\n\nWe can take advantage of this by always putting all stable packages (such as those obtained through asset store) into the `Plugins` folder and putting the packages that we change frequently directly underneath the `Assets` folder.\n\nAnd because we are using directory links, and the entire `CubeMover-Windows` folder is ignored by source control, changing the location of these directory links is trivial.  You can modify this directory structure multiple times per day based on what you're working on, by simply using changing a few things in the Projeny Package Manager window.\n\nTo see this in action, open up the `AllMovers-Windows` project.\n\nBy default, the assets folder should appear as follows:\n\n* AllMovers\n* CommonShapeMover\n* CubeMover\n* Plugins\n    * Projeny\n* SphereMover\n\nIf we are only working within the `AllMovers` project, there is no reason we need to be recompiling `CommonShapeMover`, `CubeMover`, and `SphereMover` projects every time a script changes.  So these projects can be moved to be underneath the `Plugins` folder.\n\nTo do this, open up the package manager by clicking on the menu item `Projeny -\u003e Package Manager...`.  You should see something like this:\n\n\u003cimg src=\"Docs/Screen1.png?raw=true\" alt=\"Package Manager\" /\u003e\n\nIf you click on the Edit button you should see the `ProjenyProject.yaml` file associated with this project.  This file contains all projeny configuration settings for your project.  You can edit this file by hand, or use the GUI provided by the Package Manager window as shown above.\n\nNow, drag the `CommonShapeMover`, `CubeMover`, and `SphereMover` projects to the `Plugins` folder, so that it looks like this:\n\n\u003cimg src=\"Docs/Screen2.png?raw=true\" alt=\"Package Manager\" /\u003e\n\nThen click the \"Update Directories\" button.  This will update the `ProjenyProject.yaml` file and also update the directory links in our project to match.  After Unity refreshes, if you look at the `Assets` tab, it should now appear how we want:\n\n* AllMovers\n* Plugins\n    * CommonShapeMover\n    * CubeMover\n    * Projeny\n    * SphereMover\n\nNow we can continue coding within the `AllMovers` project and benefit from faster compile times.\n\n### \u003ca id=\"platform-specific-folders\"\u003e\u003c/a\u003e5 - Platform specific package folders\n\nUnity 5 adds some helpful features, including the ability to enable/disable a DLL based on platform.  If you add a DLL to your project then click on it you get a bunch of checkboxes in the inspector that allow you to choose which platform this DLL is for.   Projeny allows you to do something similar except for all assets and directories.\n\nThis is possible because when Projeny generates your Unity project, it can choose a different set of package folders to include based on the current platform, since each platform has its own Unity project directory generated for it.\n\nOne example use for this is if you had a large Resources folder that contained a lot of data for a specific platform.  Since Unity always includes the contents of the Resources folders for builds, this would cause your platform specific files inside Resources to be included on other platforms for no reason.  Using Projeny, you can simply move the Resources folder to a platform specific package to address this problem\n\nThis can also make things easier when it comes to code.  You can have entire package folders be platform specific, then you no longer need to add #ifdef's around entire files to avoid the compile errors on other platforms.\n\nFor more details on how to use this feature, see \u003ca href=\"#package-yaml\"\u003ethe section on package configuration\u003c/a\u003e.\n\n### \u003ca id=\"dependency-management\"\u003e\u003c/a\u003e6 - Dependency Management of Packages\n\nWhen adding a package to the `UnityPackages` directory, you can also specify the packages that this package depends on.  Then, when Projeny is generating your Unity project directory, it can automatically figure out which packages you need.\n\nThis is very powerful, because often when working on a new project you want to just be able to ask for package X, and you don't want to have to think about what other packages this package requires.\n\nTo see this in action, open up the `AllMovers-Windows` project again.  Then open the package manager by clicking `Projeny -\u003e Package Manager...`.  In the Project section, try deleting the projects `CommonShapeMover`, `CubeMover`, and `SphereMover`.  You can do this by either clicking them and hitting delete, or right clicking and selecting Remove.  The package manager should then look like this:\n\n\u003cimg src=\"Docs/Screen3.png?raw=true\" alt=\"Package Manager\" /\u003e\n\nThen hit \"Update Directories\".  If you then look at the `Assets` tab, you should see the following directory structure:\n\n* AllMovers\n* Plugins\n    * CommonShapeMover\n    * CubeMover\n    * Projeny\n    * SphereMover\n\nSo the question is, why were the `SphereMover`, `CommonShapeMover`, and `CubeMover` packages added even when not specified in the `ProjenyProject.yaml` file?\n\nThe reason for this is that the `AllMovers` package has its own list dependencies separate from the project.\n\nTo see this, click the arrow on the far left side in the Package Manager window.  This will change the view to show the full list of packages that are available for use in your project, in addition to the previous screen that showed the current `ProjenyProject.yaml` configuration settings.\n\nNow, right click on the `AllMovers` package in the Packages list and select `Edit ProjenyPackage.yaml`, as shown here:\n\n\u003cimg src=\"Docs/Screen4.png?raw=true\" alt=\"Package Manager\" /\u003e\n\nThis will open up the file at `UnityPackages/AllMovers/ProjenyPackage.yaml`.  It should appear as follows:\n\n    Dependencies:\n        - CubeMover\n        - SphereMover\n\nThis tells Projeny that whenever the `AllMovers` package is added to a project, the `SphereMover` and `CubeMover` packages should be added as well.  Once Projeny processes the `ProjenyPackage.yaml` file for the `AllMovers` project, it will then look at the `ProjenyPackage.yaml` for the `CubeMover` and the `SphereMover` projects, and then repeat again for those dependencies, etc.  (The `CubeMover` and `SphereMover` packages are what contain the reference to `CommonShapeMover`).\n\n### \u003ca id=\"visual-studio-generation\"\u003e\u003c/a\u003e7 - More intelligent Visual Studio Solution generation\n\nProjeny can also take advantage of the dependency information between packages to generate a better Visual Studio project.\n\nTo see this in action, open up the `AllMovers-Windows` project, and then click the menu item `Projeny -\u003e Package Manager...`.  Then click on the arrow button on the right until you reach this screen:\n\n\u003cimg src=\"Docs/Screen5.png?raw=true\" alt=\"Package Manager\" /\u003e\n\nClick the Open Solution button.  By default this will open the solution using the default program, but you can also set this explicitly in the `Projeny.yaml` by setting a value for `VisualStudioIdePath` like below:\n\n    PathVars:\n        UnityPackagesDir: '[ConfigDir]/UnityPackages'\n        UnityProjectsDir: '[ConfigDir]/UnityProjects'\n        LogPath: '[ConfigDir]/PrjLog.txt'\n        VisualStudioIdePath: 'C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/devenv.exe'\n\nAfter opening the solution, you should see two C# projects.  One named \"AssetsFolder\" that contains all C# files under the `Assets/` folder and one named \"PluginsFolder\" that contains all C# files underneath the `Plugins/` folder.  So far, this is the same as the solution that Unity produces when it generates its visual studio solution.\n\nGo back to the Package manager and drag the following projects over:\n\n\u003cimg src=\"Docs/Screen6.png?raw=true\" alt=\"Package Manager\" /\u003e\n\nNow, if you hit Update Solution, and go back to Visual Studio you should see the following:\n\n\u003cimg src=\"Docs/Screen7.png?raw=true\" alt=\"Package Manager\" /\u003e\n\nAs you can see, every package that you drag to the list on the right in the Package Manager will have a C# project created for it.  You'll also notice that the AssetsFolder has disappeared.  This is because Projeny did not find any files left over to place in it, so it didn't bother to create the project.  But, since we did not drag over the `CommonShapeMover` project, the PluginsFolder project has remained.\n\nThis can be helpful for code organization but more importantly, this allows you to design dependencies on a module level.  In normal Unity projects, every code file could potentially make use of any other code file in your entire project.  For small projects this is not an issue, however, as your project scales in size it is helpful to be able to design code at a module level and avoid having your project devolve into a [Big ball of mud](https://en.wikipedia.org/wiki/Big_ball_of_mud).\n\nFor example, it is common to build up a library of re-usable utility functions that you can use in multiple Unity projects, such as a math library.  For these cases, it would be important to avoid using game-specific code from within your math library, because then your math library would be strongly coupled to your game and you wouldn't be able to use it in other projects.  If you compile using the Projeny generated solution file, this would not be a problem, since it would guarantee these dependencies remain intact, even though Unity itself would allow them.\n\nIf you want to use the Projeny-generated visual studio solution as your primary editor, you can also set up Unity to use it by default.  You can do this by doing the following:\n* Open Unity and go to `Edit -\u003e Preferences -\u003e External Tools`\n* Click the dropdown next to `External Script Editor`\n* Click Browse\n* Navigate to the install directory of Projeny (by default this is at `C:\\Program Files (x86)\\Projeny`) and select `Bin/PrjOpenInVisualStudio.bat` (note that you may have to select `AllFiles` in the bottom right dropdown)\n* Next to `External Script Editor Args` type `\"$(File)\" \"$(Line)\"`\n\nNow, when you double click a C# script or an error message in the Unity console it should open the file in the Projeny generated solution.  Note that in this case you will have to set a value for `VisualStudioIdePath` as described above.\n\nNote the following:\n- The contents of the `Visual Studio Solution` list in the Package Manager are saved to `ProjenyProject.yaml`.  If you click the edit button from Package Manager after following the steps above you can see this.\n- The C# project dependencies are generated based on the dependencies that are declared for the package in a `ProjenyPackage.yaml` file, as described in the \u003ca href=\"#dependency-management\"\u003eprevious section\u003c/a\u003e. (you can see this by clicking `References -\u003e Add Reference` then looking at `Solution -\u003e Projects` from within Visual Studio)\n- The solution file is generated and saved at `UnityProjects/AllMovers-Windows.sln`.  Not to be confused with `UnityProjects/AllMovers-Windows/AllMovers-Windows.sln` which is (usually) the path to the solution generated by Unity\n- The solution file and all csproj files are fully generated, and therefore you should not change any settings on them, such as preprocessor defines, output paths, etc. Any change that you make here will be over-written next time you update the solution. Also, note that if you're using source control, the csproj files and solution file will be ignored since the entire Unity `Assets` directory is ignored.  You can however, use Visual Studio to create/remove files without an issue, since these files will be added again next time Projeny updates it.\n- The DLL's generated by this custom solution are not used at all, just like the DLL's generated by the normal Unity-generated solution are not used at all . Unity still has to recompile all the code itself, even if we've already compiled it using the custom solution.\n- The generated solution file is platform specific, since each platform contains different preprocessor defines.  This is good to be aware of because it means you will have to exit visual studio and re-open the solution when changing platforms.\n- You can also add regular expressions to the project list.  You can do this within the package manager by right clicking on empty space inside the Visual Studio Solution list then selecting `Add As Regex...`.  For example, to create a Visual Studio project for every package, add a regex with value `.*`.  Note that the rules for this regular expression are the same as those used in the python programming language (more details \u003ca href=\"https://docs.python.org/2/library/re.html\"\u003ehere\u003c/a\u003e)\n\n## \u003ca id=\"managing-assetstore-assets\"\u003e\u003c/a\u003eManaging Asset Store Assets / Releases\n\nIf you open the menu item `Projeny -\u003e Package Manager` and click the left arrow all the way to the left, you should see something similar to the following:\n\n\u003cimg src=\"Docs/Screen8.png?raw=true\" alt=\"Package Manager\" /\u003e\n\nThis is the list of \"releases\".  A \"Release\" refers to an external collection of assets, often with an associated version number.  In most cases, these refer to items that you've downloaded through the asset store but they can also be retrieved from other sources (such as a local folder on your hard drive or a remote file server).\n\nBy default, Projeny will scan your asset store cache to populate this list, so you will likely see some familiar assets listed here.\n\nAs an example, choose one of these assets and drag it into the Packages list on the right.  I'm going to choose Asset Store Tools.  After Projeny finishes creating the new package you should see something like the following:\n\n\u003cimg src=\"Docs/Screen9.png?raw=true\" alt=\"Package Manager\" /\u003e\n\nYou'll notice that the name of the package does not necessarily correspond exactly to the name of the release.  This is because by default, Projeny will use the extracted folder name as the package name.  This is necessary in some cases because some assets might require a specific folder name.  Note that you can rename the package to whatever you want after adding it (through right click menu) if the default name is not ideal.\n\nYou'll also notice that the actual release name is displayed in green.  Every time you install a release, Projeny adds a file named ProjenyInstall.yaml to the new package folder.  This file contains information about where the package came from, what version it is, etc.  This file is how Projeny is able to recognize which packages have a corresponding release.  Note that in many cases there is none, and the package was simply created from scratch (eg. `AllMovers`, `CubeMover`, etc.)\n\nThis file is also what Projeny uses to detect when you are upgrading or downgrading a package.  For example, if I now drag in Asset Store Tools again, but this time I choose version \"4.0.5\", you will get the following popup:\n\n\u003cimg src=\"Docs/Screen10.png?raw=true\" alt=\"Package Manager\" /\u003e\n\nThis same popup will be displayed when downgrading a package as well.  This can be very useful, because you do not have to be afraid of upgrading and potentially introducing new issues to your project.  You can rest assured that the previous versions will remain in the Releases list in case you ever need to downgrade (which isn't possible using the asset store)\n\nNote also that after you add the release as a package, you will also have to add it to your project, to actually have it appear in Unity.\n\nAlso note that since this list is generated from your asset store cache, in order to have new asset store items listed here you will have to purchase them through the asset store and then download them.  After download completes you can then immediately cancel the import popup.   After that, you can hit the refresh button underneath the Releases list to have your newly purchases asset ready for use.\n\nFor information on defining your own \"release source\", for use in addition to the asset store cache (for example by using a local folder on your hard drive or a remote file server) see \u003ca href=\"#custom-release-registries\"\u003ethis section\u003c/a\u003e\n\n## \u003ca id=\"multiplepackagefolders\"\u003e\u003c/a\u003eUsing Multiple Package Folders\n\nUp until now we've assumed that there is one definitive folder for all the packages that are available for inclusion in your unity projects.  However, this is configurable, so if you want, you can define multiple locations to pull packages from.  This can be especially useful if you want to define a project-specific package and you do not want to add clutter up the shared `UnityPackages` directory.\n\nTo see this in action, download the sample project and then open up the `All-Movers` project (by either opening up the `UnityProjects\\AllMovers\\AllMovers-Windows` directory within unity or running `prj --project AllMovers --openUnity` / `prj -p am -ou` from the command line)\n\nThen open up the Package Manager through the menu item `Projeny -\u003e Package Manager`.  In the Packages panel, you should see a dropdown that allows you to select where to get the package list from as shown in this screenshot:\n\n\u003cimg src=\"Docs/Screen11.png?raw=true\" alt=\"Package Manager\" /\u003e\n\nSelect the dropdown and choose the option for `[ProjectRoot]\\Packages`.  By default this will display an empty list of packages.  Right click in the list and choose `New Package`, then enter the name `Test`.  You should then see the following:\n\n\u003cimg src=\"Docs/Screen12.png?raw=true\" alt=\"Package Manager\" /\u003e\n\nNow, right click again in the list and choose `Show Root Folder In Explorer`.  This will open up the directory at `UnityProjects/AllMovers/Packages`.\n\nThe list of package folders locations that appears in this drop down is configured on a per-project basis and can be found in the `ProjenyProject.yaml` files.  The sample project is set up with two locations.  One for the common `UnityPackages` folder and one directly underneath the root folder for each project.\n\nTo see where this is set, open up the file `ProjenyProject.yaml` at `UnityProjects/ProjenyProject.yaml`.  The settings in this file will automatically be applied to all projects, in addition to the settings that are inside `UnityProjects/AllMovers/ProjenyProject.yaml`.  This file should appear as follows:\n\n    PackageFolders:\n        - '[SharedUnityPackagesDir]'\n        - '[ProjectRoot]/Packages'\n\nThis list should contain the same values as what you see in the dropdown within the Package Manager GUI.\n\n## \u003ca id=\"shareprojectsettings\"\u003e\u003c/a\u003eSharing Project Settings\n\nIn addition to sharing packages between unity projects, you can also share project settings.  Project settings include all the values that you see when you open up any menu item inside `Edit -\u003e Project Settings` within Unity.  This can be useful if you want to create a duplicate of a project with a slightly different set of packages.\n\nTo see this in action, download the sample project and then open up the `All-Movers` project (by either opening up the `UnityProjects\\AllMovers\\AllMovers-Windows` directory within unity or running `prj --project AllMovers --openUnity` / `prj -p am -ou` from the command line)\n\nThen, select the menu item `Projeny -\u003e Change Project -\u003e New`.  This should display the following popup:\n\n\u003cimg src=\"Docs/Screen13.png?raw=true\" alt=\"Package Manager\" /\u003e\n\nMake sure to check the \"Share Project Settings\" checkbox which is unchecked by default.  Give it the name `Test`.\n\nAfter clicking Submit, your new project should be initialized and then opened in Unity.  Now, if you change a project settings from the `Edit -\u003e Project Settings` menu it will apply to both the `AllMovers` and your newly created `Test` project.\n\nLike all project settings, this is configured within the `ProjenyProject.yaml` file.  If you open this up by either clicking the `Edit` button within the Package Manager or simply opening up `UnityProjects/Test/ProjenyProject.yaml` you should see the following:\n\n    ProjectSettingsPath: '[ProjectRoot]/../AllMovers/ProjectSettings'\n\nNote that since we haven't added any packages yet to our new project, there isn't a line for `AssetsFolder` and `PluginsFolder` yet.\n\n## \u003ca id=\"directorylinksgotchas\"\u003e\u003c/a\u003e\"Gotchas\" With Directory Links\n\n* Moving package folders around within Unity directly\n    * You are free to move files and directories around within Unity using Unity's \"Project\" tab, however, you should be careful not to move any package directories themselves.  Otherwise, you could end up with duplicate files the next time you get projeny to update your directory links.\n\n* Copying and pasting projects doesn't work\n    * If you copy and paste your entire directory structure to another location on your hard drive, the directory links will become empty folders in the new location.  To address this issue, after copying and pasting your files, run `prj -cla --init` on the new location.  All this does is clears all the generated files (`-cla`) and then initializes all the directory links for all projects (`--init`).\n\n* If you are using git for source control, you should be careful when using `git clean`\n    * Running `git clean -df` should work as expected, but if you run `git clean -xdf` you could lose some data.  This is because `git clean` follows directory links.  So if it tries to delete the generated files underneath your `UnityProjects` directory, this will also delete some files within the `UnityPackages` directory.  Running `git clean -df` will not have this problem because your `UnityProjects` folders should be ignored by git already and `git clean` will only delete ignored files if you also supply the `-x` option.  If you do need to include the `-x` option, then we recommend you run `prj -cla` first, which will ensure that all generated files have been cleared first.\n\n* Unlike when using `git clean`, deleting folders with Windows Explorer is safe.\n    * If you delete different unity projects underneath your `UnityProjects` directory when using Windows Explorer, this should not delete any files within `UnityPackages` (unlike when using `git clean`).  This is because when Windows Explorer encounters directory links, it just removes the reference rather than recursing into it.\n\n* After opening your project for the first time (or when adding new packages) Unity will show the following warning:\n\n    ```\n    [Asset] is a symbolic link. Using symlinks in Unity projects may cause your project to become corrupted if you create multiple references to the same asset, use recursive symlinks or use symlinks to share assets between projects used with different versions of Unity. Make sure you know what you are doing.\n    ```\n\n    However, we are not doing any of the things that Unity warns about here so this warning can be ignored.\n\n## \u003ca id=\"faq\"\u003e\u003c/a\u003eFrequently Asked Questions\n\n* #### \u003ca id=\"workflow-create-package\"\u003e\u003c/a\u003eHow do I create a new package?\n\n    * Method 1 - Using the Package Manager\n        * Click the menu item `Projeny -\u003e Package Manager`\n        * Go to the Packages section by pressing the arrow button the left\n        * Click the \"New\" button or right click and select `New Package`\n        * Enter name for your package\n        * Add your package to your project by dragging it to either `Assets` or `Plugins` on the right\n        * (optional) Add a `ProjenyPackage.yaml` file to your new package folder.   See \u003ca href=\"#package-yaml\"\u003ehere\u003c/a\u003e for details.\n\n    * Method 2 - Manually\n        * Go to the `UnityPackages` directory\n        * Create a new folder with the name of your package\n        * Done. You can now refer to this package by its folder name in `ProjenyPackage.yaml` or `ProjenyProject.yaml` files\n        * (optional) Add a `ProjenyPackage.yaml` file to your new package folder.   See \u003ca href=\"#package-yaml\"\u003ehere\u003c/a\u003e for details.\n\n* #### \u003ca id=\"workflow-create-project\"\u003e\u003c/a\u003eHow do I create a new project?\n\n    * Method 1 - Within Unity\n        * Click the menu item `Projeny -\u003e Change Project -\u003e New...`\n        * Enter the name for your new project, and choose whether you want to duplicate the project settings or not with the checkbox\n        * After the new project loads, open the Package Manager again to add packages, etc.\n        * Done\n        * (optional) Add a `ProjenyProject.yaml` file to your new project folder. See \u003ca href=\"#project-yaml\"\u003ehere\u003c/a\u003e for details.\n\n    * \u003ca id=\"workflow-create-project-command-line\"\u003e\u003c/a\u003eMethod 2 - Command Line\n        * Enter command prompt / powershell at the same directory where your `Projeny.yaml` file is\n        * Execute `prj --project MyNewProject --createProject` (or the shortened form `prj -p MyNewProject -cpr`)\n        * Done.  You can now open [ProjectName]-Windows directory in Unity.\n        * (optional) Add a `ProjenyProject.yaml` file to your new project folder. See \u003ca href=\"#project-yaml\"\u003ehere\u003c/a\u003e for details.\n\n* #### \u003ca id=\"workflow-create-new-config\"\u003e\u003c/a\u003eHow do I start an entirely new set of Projeny-based packages/projects from scratch?\n\n    * Method 1 - Command line\n        * Open command prompt / powershell at the directory where you want to create your new projects/packages.\n        * Run `prj --createConfig` (or the shorthand `prj -cc`)\n        * It will also create a new file named `Projeny.yaml` with some basic defaults (see \u003ca href=\"#projeny-yaml\"\u003ehere\u003c/a\u003e for details on this file)\n        * This will set up your new config as follows:\n            * Projects will reside in a folder named `UnityProjects`\n            * Packages will reside in a folder named `UnityPackages`.  Each project will also have the option for local packages at `UnityProjects/PROJECT_NAME/Packages`\n        * After this, you will probably want to \u003ca href=\"#workflow-create-project-command-line\"\u003ecreate a project\u003c/a\u003e\n\n    * Method 1 - Manually\n        * Create a new directory that will be the root for your project\n        * Create a file named `Projeny.yaml` at this directory with the following contents:\n\n            PathVars:\n                UnityProjectsDir: '[ConfigDir]/UnityProjects'\n                LogPath: '[ConfigDir]/PrjLog.txt'\n\n        * Create a new directory named `UnityProjects`\n        * Done\n        * After this, you will probably want to \u003ca href=\"#workflow-create-project-command-line\"\u003ecreate a project\u003c/a\u003e\n\n* #### \u003ca id=\"standardassets\"\u003e\u003c/a\u003eHow do I import Unity's Standard Assets?\n\nUnity's Standard Assets actually makes for a good example of using Projeny, since all the standard asset packages depend on each other in some ways.\n\nFor Unity version 5.3.4, we have extracted all the Standard Assets into their own Projeny packages, and also declared the proper dependencies for each using `ProjenyPackage.yaml` files.  This can be downloaded as `StandardAssets-Unity5.3.4.zip` from the [releases page](https://github.com/modesttree/Projeny/releases/tag/v0.3.4).  To use, you can extract `StandardAssets-Unity5.3.4.zip` into your UnityPackages folder and drag whichever Standard Assets package you need into your project via the projeny gui\n\n## \u003ca id=\"projeny-yaml\"\u003e\u003c/a\u003eProjeny.yaml reference\n\nThe `Projeny.yaml` file contains general settings for Projeny, including the location of tools such as Unity, where to place the log output, etc.\n\nNote that like all configuration files in Projeny, `Projeny.yaml` is defined using the \u003ca href=\"https://en.wikipedia.org/wiki/YAML\"\u003eYAML standard\u003c/a\u003e.\n\nWhen running Projeny from the command line using the `prj` command, it will load all configuration files from the following locations\n\n* `[Current directory]/Projeny.yaml`\n* `[User Home Directory]/Projeny.yaml` - For example, if your user account name is John: `C:/Users/John/Projeny.yaml`\n\nTypically, you would have configuration files in both of these locations.  The configuration file in your home directory is particularly useful for defining the paths to the tools that Projeny sometimes runs, such as Visual Studio and Unity.\n\nIf you follow \u003ca href=\"#workflow-create-new-config\"\u003ethe instructions to create a new Projeny-based set of projects\u003c/a\u003e, you will find that a default `Projeny.yaml` file is created with the following contents:\n\n    PathVars:\n        UnityProjectsDir: '[ConfigDir]/UnityProjects'\n        LogPath: '[ConfigDir]/PrjLog.txt'\n\nThis is the absolute minimum config that is required for Projeny.  (Actually, you don't strictly need `LogPath` defined, but it is useful if you want detailed error information.  Every time you run the `prj` command in the directory with this `Projeny.yaml`, the `PrjLog.txt` file will be updated with more detailed information)\n\nHere is the full list of configuration settings.  Note that you don't need to include most of these, since they have reasonable defaults, but they are listed here for reference.  Note: Comments can be added by prefixing your line with a `#` character.\n\n\u003ca id=\"projeny-yaml-example\"\u003e\u003c/a\u003e\n\n    # If you use the command line a lot, it can be useful to define an \n    # alias for the common projects you are changing. These are taken \n    # from the demo project.  Running `prj -p am` is then the same as \n    # running `prj -p AllMovers`\n    ProjectAliases:\n        am: AllMovers\n        cm: CubeMover\n        sm: SphereMover\n\n    # The given project here will be used by the `prj` command line \n    # tool whenever the `-p` option is not included\n    DefaultProject: AllMovers\n\n    # This is a collection of paths that are used by projeny\n    # You can also define your own variables here and use them in any of the config files\n    # Note also that you can use environment variables here the same way eg: [SOME_ENVIRONMENT_VARIABLE]\n    PathVars:\n        # This setting is required\n        # This will determine where projeny looks for the unity projects\n        UnityProjectsDir: '[ConfigDir]/UnityProjects'\n\n        # This setting is necessary for many different Projeny operations \n        # so that Projeny knows how to run Unity. By default it will \n        # guess the following path\n        UnityExePath: 'C:/Program Files/Unity/Editor/Unity.exe'\n\n        # This value is used when using the command line options `-b` or \n        # `bf` or `bcs` (see command line reference section for details on these)\n        # It is used to build visual studio solution files\n        # By default it will assume the following path unless you specify it yourself\n        MsBuildExePath: 'C:/Windows/Microsoft.NET/Framework/v4.0.30319/msbuild.exe'\n\n        # This value is required when UseDevenv setting (see below) is set to true\n        VisualStudioCommandLinePath: 'C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/devenv.com'\n\n        # This value is required for the button \"Open Solution\" in package manager,\n        # or the equivalent command line option `prj -ocs`\n        VisualStudioIdePath: 'C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/devenv.exe'\n\n        # This value will determine where the `prj` command outputs \n        # detailed logging information\n        LogPath: '[ConfigDir]/PrjLog.txt'\n\n    Console:\n        # If you're using a console that supports multiple colors, set \n        # this to true so that warnings are yellow, errors are red, etc.\n        UseColors: False\n\n    # Custom release sources can also be specified in `Projeny.yaml` if \n    # you want the Releases list to contain more than just items from the asset store cache\n    ReleaseSources:\n        - LocalFolder:\n            Path: 'C:/MyUnityPackages'\n\n        # Note that you can specify multiple local folders\n        - LocalFolder:\n            Path: 'G:/NetworkSharedUnityPackages'\n\n        # Note that you can specify multiple file servers\n        - FileServer:\n            ManifestUrl: 'http://localhost:8092/ProjenyReleaseManifest.txt'\n\n    Compilation:\n        # This value is used when using the command line options `-b` or `bf` \n        # or `bcs` (see command line reference section for details on these)\n        # By default, Projeny will use MsBuild (using the MsBuildExePath \n        # defined above) to build the visual studio solution. However, some \n        # people may prefer to use devenv.exe instead, since unlike msbuild \n        # this is guaranteed to produce identical behaviour to building using \n        # the Visual Studio GUI.  So if you want to use devenv.exe instead, \n        # set this to true and then make sure to specify the path variable\n        # 'VisualStudioCommandLinePath' as well in the PathVars section above\n        UseDevenv: False\n\n    SolutionGeneration:\n        # This will be used in the \"DefaultNamespace\" field for generated visual studio projects\n        RootNamespace: MyCompanyName\n\n    Unity:\n        # Include this option to default new projects to use 64 bit windows for their builds rather \n        # than 32 bit\n        Win64IsDefault: True\n\n## \u003ca id=\"project-yaml\"\u003e\u003c/a\u003eProjenyProject.yaml reference\n\nIn most cases you can edit the `ProjenyProject.yaml` file using the Package Manager from within Unity.  However, the Package Manager GUI does not include everything (for example, solution folders cannot be configured from the package manager)\n\nNote that like all configuration files in Projeny, `ProjenyProject.yaml` is defined using the \u003ca href=\"https://en.wikipedia.org/wiki/YAML\"\u003eYAML standard\u003c/a\u003e.\n\nNote that you can define multiple `ProjenyProject.yaml` files, with the result that they will all be applied to the project.  There are 4 places that Projeny looks for this file.  For example, given a project named `Foo`, these locations are as follows:\n\n1. `UnityProjects/Foo/ProjenyProject.yaml`\n2. `UnityProjects/Foo/ProjenyProjectCustom.yaml`\n3. `UnityProjects/ProjenyProject.yaml`\n4. `UnityProjects/ProjenyProjectCustom.yaml`\n\nThese all follow the same format. (3) and (4) are automatically used by all projects, so it's a good place to put in packages that you want to include everywhere.\n\n(2) and (4) should be ignored by source control and are a convenient place to add user-specific packages. For example, different developers on the same project might have different preferences for certain unity plugins, such as a custom unity console, a popup window to help switch between scenes, etc.  So the `ProjenyProjectCustom.yaml` files can be used for this purpose, to add packages on an individual basis.\n\nThe format of `ProjenyProject.yaml` is as follows:\n\n    AssetsFolder:\n        - {PackageName}\n        - {PackageName}\n\n    PluginsFolder:\n        - {PackageName}\n        - {PackageName}\n        - {PackageName}\n\n    SolutionProjects:\n        - {PackageName}\n        - /{PackageNamePattern}\n        - /{PackageNamePattern}\n        - {PackageName}\n\n    SolutionFolders:\n        {FolderName}: /{PackageNamePattern}\n        {FolderName}: /{PackageNamePattern}\n\n    PackageFolders:\n        - {DirectoryPath}\n        - {DirectoryPath}\n\n    TargetPlatforms:\n        - Windows\n        - WebPlayer\n        - Android\n        - WebGL\n        - OSX\n        - Linux\n        - iOS\n        - UWP\n\nWhere:\n* `{PackageName}` represents the name of a directory that is in one of the `PackageFolders` directories\n* `{PackageNamePattern}` represents a python regular expression that is used to match one more packages in the `UnityPackages` directory\n\nNote the following:\n* Packages that are listed underneath the `AssetsFolder` category will be placed directly underneath the `Assets/` directory of your project\n* Packages that are listed underneath the `PluginsFolder` category will be placed directly underneath the `Assets/Plugins` directory of your project\n* All packages underneath the `SolutionProjects` category will have their own .csproj file generated, when running `Project -\u003e Update C# Project` or when hitting the `Update Solution` button within the package manager\n    * Note that you can also use a regular expression instead of explicitly listing the full package name. For example, if you want to create a C# project for every package in your project add the line `/.*` which will match everything\n* You can also optionally add folders to the generated solution, to organize related projects together.  Each folder has one regex pattern that is used to filter the full list of projects, and must also be prefixed with a forward slash\n* All the regexes used in the package files follows the regex rules defined for python (more details \u003ca href=\"https://docs.python.org/2/library/re.html\"\u003ehere\u003c/a\u003e)\n\n## \u003ca id=\"package-yaml\"\u003e\u003c/a\u003eProjenyPackage.yaml reference\n\nNote that like all configuration files in Projeny, `ProjenyPackage.yaml` is defined using the \u003ca href=\"https://en.wikipedia.org/wiki/YAML\"\u003eYAML standard\u003c/a\u003e.  Unlike project settings, there is no GUI for package settings so you have to hand-edit the `ProjenyPackage.yaml` files.\n\nIn most cases your `ProjenyPackage.yaml` will simply list the other packages that this package depends on.  It will look like this:\n\n    Dependencies:\n        - CubeMover\n        - SphereMover\n\nThis is taken from the demo project (at `UnityPackages/AllMovers/ProjenyPackage.yaml`).\n\nNote that this file is optional.  When not added to your package, your package will just be assumed to have zero dependencies.\n\nThere are a number of other options here for less common cases.  The full format of the `ProjenyPackage.yaml` is as follows:\n\n    Dependencies:\n        - {PackageName}\n        - {PackageName}\n        - {PackageName}\n\n    Extras:\n        - {PackageName}\n        - {PackageName}\n\n    FolderType: {FolderType}\n\n    Platforms:\n        - {PlatformName}\n        - {PlatformName}\n        - {PlatformName}\n\n    ForcePluginsDirectory: {True/False}\n    ForceAssetsDirectory: {True/False}\n\nNotes:\n* `{PackageName}` represents the name of a directory that is below your `UnityPackages` directory.\n* Any packages that are listed under `Dependencies` or `Extras` will always be added to every project that includes this package\n    * The only difference between Dependencies and Extras is that Projeny will create a csproj dependency for packages under Dependencies whereas it will not for those packages under Extras.  Most of the time you will want to only add to Dependencies, however in some rare cases it can be useful to use Extras.  For example, if you have split out a bunch of unit tests for your package into its own separate package, and you want to always include those with your package, you would add them to the Extras list.  You would not want to add them under Dependencies because this would create a circular dependency and Projeny will display an error.\n* By default, Projeny will assume that your package is applicable to all platforms.  However, if the `Platforms` list is set, Projeny will skip this package for all platforms except those listed, so your package directory will only be linked to in the Unity Projects for those platforms.  `{PlatformName}` can be one of the following:\n    * Windows\n    * WebPlayer\n    * Android\n    * WebGL\n    * OSX\n    * Linux\n    * iOS\n    * UWP\n* When `ForcePluginsDirectory` is set, this will require that the package always be placed at `Assets/Plugins/PackageName`.\n    * This exists because some packages have hard-coded paths that require that the package be at a specific location\n* `ForceAssetsDirectory` behaves similarly, and will ensure the package will always be placed at `Assets/PackageName`.\n* `FolderType` can be set to any of the following:\n    * Normal\n        * This is the default when this setting is unspecified\n    * StreamingAssets\n        * Package will be placed at `Assets/StreamingAssets/YourPackageName`\n        * This has special meaning to Unity - see \u003ca href=\"http://docs.unity3d.com/Manual/SpecialFolders.html\"\u003ehere\u003c/a\u003e for details\n    * WebGL\n        * Package will be placed at `Assets/Plugins/WebGL`\n        * This has special meaning to Unity - see \u003ca href=\"http://docs.unity3d.com/Manual/webgl-interactingwithbrowserscripting.html\"\u003ehere\u003c/a\u003e for details\n    * AndroidProject\n        * Package will be placed at `Assets/Plugins/Android`\n        * This has special meaning to Unity - see \u003ca href=\"http://wiki.unity3d.com/index.php/Special_Folder_Names_in_your_Assets_Folder\"\u003ehere\u003c/a\u003e for details\n    * AndroidLibraries\n        * Package will be placed at `Assets/Plugins/Android/libs`\n        * This has special meaning to Unity - see \u003ca href=\"http://docs.unity3d.com/Manual/PluginsForAndroid.html\"\u003ehere\u003c/a\u003e for details\n    * iOS\n        * Package will be placed at `Assets/Plugins/ios`\n        * This has special meaning to Unity - see \u003ca href=\"http://docs.unity3d.com/Manual/PluginsForIOS.html\"\u003ehere\u003c/a\u003e for details\n\n## \u003ca id=\"custom-release-registries\"\u003e\u003c/a\u003eCustom Release Sources\n\nA mentioned in the \u003ca href=\"#managing-assetstore-assets\"\u003eabove section\u003c/a\u003e, the list of releases is usually just a list of your asset store purchases, however it supports other sources as well.\n\nEvery source is ultimately just a collection of Unity packages.  This is also what Unity stores in the asset store cache, so even in that case, it is just a list of Unity packages.\n\nFor example, to add a new local folder source, open up one of your Projeny config files (`Projeny.yaml`) and include the following:\n\n    ReleaseSources:\n        - LocalFolder:\n            Path: 'C:/MyLocalFolderSource'\n\nOne convenient place that you might want to put this is in the system wide Projeny config, which can be found in your user home directory at `C:/Users/[Your User Name]/Projeny.yaml`.  This is convenient because these releases will then be available for any Unity project that you create through Projeny on your computer.\n\nNow, if you copy and paste `.unitypackage` files into this folder, and click the Refresh button in the Package Manager (accessed within Unity through the menu at `Projeny -\u003e Package Manager`) then these `.unitypackage` files will be displayed in the Releases list.\n\nNote that you can add multiple local folder sources using different paths, including those on a network share.\n\nNote also that you can specify the version for your custom unitypackage file by using the following naming convention:  `MyCustomPackage@1.2.unitypackage`.  In this case, it will load it as version \"1.2\".  This naming convention is only necessary for custom unitypackage files that you create yourself.  Any `unitypackage` files that you download through the asset store will have this version information embedded into it.\n\nSharing a release source over a network can be very useful when working in an office environment that has its own LAN.   Your organization can build up a big collection of \"releases\" that anyone in the organization can have access to.\n\nIf you don't want to use a network share for this, you can also define a FileServer release source, which is declared using a URL.  You can then run a static web site that can serve out the Unity packages to anyone on the network.\n\nFirst, you have to host a static web site that simply contains a flat list of `.unitypackage` files.  Then you need to run `PrjUpdateReleaseManifest [directory]` with the path to the directory you want to scan (or simply `.` for current directory).  This will result in a file being created in this same directory called `ProjenyReleaseManifest.txt`.  The `PrjUpdateReleaseManifest` also includes a command line option to 'watch' the directory indefinitely, so you can just upload files there and the manifest will automatically be updated.\n\nAfter setting up your file server you can declare it as a release source in one of your `Projeny.yaml` as follows:\n\n    ReleaseSources:\n        - FileServer:\n            ManifestUrl: 'http://mysharedserver/ProjenyReleaseManifest.txt'\n\n## \u003ca id=\"command-line-reference\"\u003e\u003c/a\u003eCommand Line Reference\n\nAlmost all operations in Projeny can be executed within Unity using the Projeny menu or the Package Manager.  However, not all (for eg: building the Visual Studio solution).  It can also be useful to be able to drive it from the command line for use with continous integration servers or whatever build pipeline you are using at your organization.\n\nWhat follows is the full list of command line parameters that you can pass to the `Prj` command.  Note that you can pass any combination of these and `Prj` will execute them in a reasonable order.\n\n* #### \u003ca id=\"commandline-openDocumentation\"\u003e\u003c/a\u003e`--openDocumentation` / `-d`\n    * Opens up the documentation page that you are reading\n\n* #### \u003ca id=\"commandline-project\"\u003e\u003c/a\u003e`--project` / `-p`\n    * Selects the project to use for whatever other parameters are given\n    * Note that if there is only one project then this option can be omitted\n    * For example, if you run `prj -p AllMovers -ul` this will update all the directory links for the `AllMovers` project (using the default platform which is windows).\n    * Valid values are the names of the directories underneath the `UnityProjects` directory. \n        * You can view the full list of projects by running the \u003ca href=\"#commandline-listProjects\"\u003e`-lp` command\u003c/a\u003e\n        * You can also pass in one of the project aliases defined in your `ProjenyProject.yaml` file, to avoid typing the full name every time\n\n* #### \u003ca id=\"commandline-platform\"\u003e\u003c/a\u003e`--platform` / `-pl`\n    * Selects the platform to use for whatever other parameters are given\n    * Note that if this parameter is not supplied Projeny will assume windows\n    * Valid values are the following:\n        * `win` - Windows\n        * `webp` - Webplayer\n        * `webgl` - WebGL\n        * `and` - Android\n        * `osx` - Mac\n        * `ios` - iOS for use with iPhone or iPad\n        * `lin` - Linux\n        * `uwp` - Universal Windows Platform\n    * For example, if you run `prj -p AllMovers -pl ios -ul` this will update all the directory links within the `AllMovers-iOS` directory.\n\n* #### \u003ca id=\"commandline-updateLinks\"\u003e\u003c/a\u003e`--updateLinks` / `-ul`\n    * Updates all the directory links for the given project and platform.\n    * Projeny will read the `Project.yaml` file associated with the given project, then calculate all the packages that it needs to include.  For each package, it will then create a directory link (aka windows junction aka symbolic link) inside either the `Assets/` directory or the `Assets/Plugins` directory\n    * Note that in order to run this command you must \u003ca href=\"#commandline-project\"\u003especify a project\u003c/a\u003e (or set a default project in `Projeny.yaml`) and also optionally \u003ca href=\"#commandline-platform\"\u003eset a platform\u003c/a\u003e (otherwise it will assume windows)\n\n* #### \u003ca id=\"commandline-listProjects\"\u003e\u003c/a\u003e`--listProjects` / `-lp`\n    * Lists the names of all the directories that are underneath the `UnityProjects` directory, along with the alias for each if one is defined.\n\n* #### \u003ca id=\"commandline-updateCustomSolution\"\u003e\u003c/a\u003e`--updateCustomSolution` / `-ucs`\n    * Generates .csproj files and a .sln file based on the configuration set in the Project.yaml for the given project and given platform\n    * See \u003ca href=\"#visual-studio-generation\"\u003ehere\u003c/a\u003e for more details on this feature.\n    * Note that in some cases you will want to run \u003ca href=\"#commandline-updateUnitySolution\"\u003e`-uus`\u003c/a\u003e at the same time or before executing this command.  This is not necessary all the time but is necessary whenever you add DLL's to your project, add/remove a define in player settings, etc.  Also, if `-uus` has not been run at least once this command will fail\n    * Note that in order to run this command you must \u003ca href=\"#commandline-project\"\u003especify a project\u003c/a\u003e (or set a default project in `Projeny.yaml`) and also optionally \u003ca href=\"#commandline-platform\"\u003eset a platform\u003c/a\u003e (otherwise it will assume windows)\n\n* #### \u003ca id=\"commandline-updateUnitySolution\"\u003e\u003c/a\u003e`--updateUnitySolution` / `-uus`\n    * Runs Unity.exe to generate the standard MonoDevelop solution, so that it can be used by the \u003ca href=\"#commandline-updateCustomSolution\"\u003e`-ucs` command\u003c/a\u003e.  This is equivalent to opening Unity and running the menu item `Assets -\u003e Open C# Project` (except without actually opening visual studio/monodevelop)\n\n* #### \u003ca id=\"commandline-verbose\"\u003e\u003c/a\u003e`--verbose` / `-v` and \u003ca id=\"commandline-veryVerbose\"\u003e\u003c/a\u003e`--veryVerbose` / `-vv`\n    * These parameters can control how verbose the logging output is to the console.  `-v` will output some extra detail in places and `-vv` will output absolutely everything (including the contents of the Unity editor log, visual studio, etc.)\n\n* #### \u003ca id=\"commandline-buildCustomSolution\"\u003e\u003c/a\u003e`--buildCustomSolution` / `-b`\n    * Builds the custom solution\n    * Note: Will either use the `VisualStudioCommandLinePath` or the `MsBuildExePath` settings in `Projeny.yaml` to run the build, depending on the value of `UseDevenv`.  See \u003ca href=\"#projeny-yaml-example\"\u003ehere\u003c/a\u003e for details.\n    * This command will fail if the custom solution has not been generated yet using the \u003ca href=\"#updateCustomSolution\"\u003e`-ucs` command\u003c/a\u003e\n    * Note that in order to run this command you must \u003ca href=\"#commandline-project\"\u003especify a project\u003c/a\u003e (or set a default project in `Projeny.yaml`) and also optionally \u003ca href=\"#commandline-platform\"\u003eset a platform\u003c/a\u003e (otherwise it will assume windows)\n\n* #### \u003ca id=\"commandline-buildFull\"\u003e\u003c/a\u003e`--buildFull` / `-bf`\n    * This command is equivalent to the following: `prj -ul -uus -ucs -b`\n        * In other words, it will update the links for the given project/platform, update the custom solution, then build the custom solution\n        * See these other commands for details\n    * Note that in order to run this command you must \u003ca href=\"#commandline-project\"\u003especify a project\u003c/a\u003e (or set a default project in `Projeny.yaml`) and also optionally \u003ca href=\"#commandline-platform\"\u003eset a platform\u003c/a\u003e (otherwise it will assume windows)\n\n* #### \u003ca id=\"commandline-openUnity\"\u003e\u003c/a\u003e`--openUnity` / `-ou`\n    * Opens Unity for the given project/platform\n    * Note that in order to run this command you must \u003ca href=\"#commandline-project\"\u003especify a project\u003c/a\u003e (or set a default project in `Projeny.yaml`) and also optionally \u003ca href=\"#commandline-platform\"\u003eset a platform\u003c/a\u003e (otherwise it will assume windows)\n\n* #### \u003ca id=\"commandline-openCustomSolution\"\u003e\u003c/a\u003e`--openCustomSolution` / `-ocs`\n    * Opens the custom solution for the given project/platform using visual studio\n    * Note that this command will require that you set your `VisualStudioIdePath` in `Projeny.yaml`\n    * This command will also fail if the custom solution has not been generated yet using the \u003ca href=\"#updateCustomSolution\"\u003e`-ucs` command\u003c/a\u003e\n    * Note that in order to run this command you must \u003ca href=\"#commandline-project\"\u003especify a project\u003c/a\u003e (or set a default project in `Projeny.yaml`) and also optionally \u003ca href=\"#commandline-platform\"\u003eset a platform\u003c/a\u003e (otherwise it will assume windows)\n\n* #### \u003ca id=\"commandline-clearProjectGeneratedFiles\"\u003e\u003c/a\u003e`--clearProjectGeneratedFiles` / `-clp`\n    * Deletes all the generates files/directories for the given project.   Note that this will not delete any real content, it will only remove some directory links and some temporary files generated by Unity.\n    * This command is sometimes useful if you want to do a full reset of your project, which you can do by running `prj -clp -bf`.  This will delete all generated files for the given project and then re-generate them again and build the visual studio solution.\n    * Note that in order to run this command you must \u003ca href=\"#commandline-project\"\u003especify a project\u003c/a\u003e (or set a default project in `Projeny.yaml`)\n\n* #### \u003ca id=\"commandline-clearAllProjectGeneratedFiles\"\u003e\u003c/a\u003e`--clearAllProjectGeneratedFiles` / `-cla`\n    * This is similar to the `-clp` command except this will be executed for every project in your `UnityProjects` directory\n\n* #### \u003ca id=\"commandline-deleteAllLinks\"\u003e\u003c/a\u003e`--deleteAllLinks` / `-dal`\n    * Removes all directory links in all projects.  This is the reverse of the \u003ca href=\"#commandline-init\"\u003e`-in` command\u003c/a\u003e\n\n* #### \u003ca id=\"commandline-init\"\u003e\u003c/a\u003e`--init` / `-in`\n    * This is equivalent to running the \u003ca href=\"#commandline-updateLinks\"\u003e`-ul` command\u003c/a\u003e on all the projects that are underneath the `UnityProjects` directory\n\n* #### \u003ca id=\"commandline-deleteProject\"\u003e\u003c/a\u003e`--deleteProject` / `-dpr`\n    * Deletes the given project from the from `UnityProjects` directory\n\n* #### \u003ca id=\"commandline-suppressPrompts\"\u003e\u003c/a\u003e`--suppressPrompts` / `-sp`\n    * If unset, confirmation prompts will be displayed for important operations.\n\n* #### \u003ca id=\"commandline-createProject\"\u003e\u003c/a\u003e`--createProject` / `-cpr`\n    * Creates a new directory in the `UnityProjects` directory, adds a default `ProjenyProject.yaml` file, and sets up directory links\n\n* #### \u003ca id=\"commandline-configPath\"\u003e\u003c/a\u003e`--configPath` / `-cfg`\n    * The path to the main `ProjenyProject.yaml` config file.  If unspecified, it will be assumed to exist at `[CurrentDirectory]/ProjenyProject.yaml`\n\n* #### \u003ca id=\"commandline-listPackages\"\u003e\u003c/a\u003e`--listPackages` / `-lpa`\n    * Lists all the directories found in the `UnityPackages` directory\n\n* #### \u003ca id=\"commandline-deletePackage\"\u003e\u003c/a\u003e`--deletePackage` / `-dpa`\n    * Deletes the directory at `UnityPackages/x` where x is the given value\n\n* #### \u003ca id=\"commandline-installRelease\"\u003e\u003c/a\u003e`--installRelease` / `-ins`\n    * Searches all release sources for the given release with given version\n\n* #### \u003ca id=\"commandline-listReleases\"\u003e\u003c/a\u003e`--listReleases` / `-lr`\n    * Lists all releases found from all release sources\n\n* #### \u003ca id=\"commandline-editProjectYaml\"\u003e\u003c/a\u003e`--editProjectYaml` / `-epy`\n    * Opens up the `ProjenyProject.yaml` for the given project\n\n* #### \u003ca id=\"commandline-createPackage\"\u003e\u003c/a\u003e`--createPackage` / `-cpa`\n    * Creates a new folder underneath the `UnityPackages` directory with the given name\n\n## \u003ca id=\"appendix\"\u003e\u003c/a\u003eAppendix\n\n### \u003ca id=\"dllgotchas\"\u003e\u003c/a\u003eA. \"Gotchas\" with using external assemblies:\n\n* You cannot really use Unity preprocessor defines inside your DLL (eg: `UNITY_WEBPLAYER`, `UNITY_5_3`, etc.) unless you create separate DLL's for each platform. This is helped somewhat by Unity 5.3, which allows you to indicate which platforms to use a given DLL in.\n* There are some known limitations of using external assemblies for code - in particular, any MonoBehaviour with a custom base class will not be allowed to be added to a game object.\n* Unity is not aware of the location of each MonoBehaviour.  You cannot for example, double click on a MonoBehaviour to open up the source file for it.\n\n## \u003ca id=\"release-notes\"\u003e\u003c/a\u003eRelease Notes\n\n0.3 (February, 2016)\n- Better error handling and error output\n- Added ability to share project settings folders across multiple projects\n- Added support for multiple packages directories. This is particularly useful to define project-specific packages.\n- Added support for special handling of prebuilt projects that produce assemblies (however this is undocumented currently)\n- Bug fixes\n\n0.2 (January, 2015)\n- Added GUI for package management within Unity, also added a lot more documentation\n\n0.1 (December, 2015)\n- Initial release\n\n## \u003ca id=\"license\"\u003e\u003c/a\u003eLicense\n\n    The MIT License (MIT)\n\n    Copyright (c) 2010-2015 Modest Tree Media  http://www.modesttree.com\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmodesttree%2Fprojeny","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmodesttree%2Fprojeny","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmodesttree%2Fprojeny/lists"}