Проблема была в том, что я не восстанавливал Nuget-Packages перед сборкой с использованием MSBuild. (При открытии Visual-Studio в графическом интерфейсе кажется, что этот шаг выполняется автоматически.)
Итак, вот полное решение от Unity-проекта до пакета приложений Holo-Lens, которое наконец-то сработало для меня:
Создать пакет Unity CommandLineBuild
Прежде всего, чтобы иметь возможность создавать Unity-проект через командную строку, вам нужен специальный класс.
Это должно быть размещено в /Assets/Editor
вашем проекте:
using UnityEngine; using UnityEditor; using System.Collections; using System.Collections.Generic; using System; namespace JENKINS { public class AutoBuilder : ScriptableObject { static string[] SCENES = FindEnabledEditorScenes(); // Use real app name here /* Anyway the App will have the name as configured within the Unity-Editor This Appname is just for the Folder in which to Build */ static string APP_NAME; static string TARGET_DIR; [MenuItem("Custom/CI/Windows Mixed Reality Build (UWP)")] public static void PerformWindowsMixedRealityBuild() { APP_NAME = GetArg("-appName"); TARGET_DIR = GetArg("-buildFolder"); Debug.Log("Jenkins-Build: APP_NAME: " + APP_NAME + " TARGET_DIR: " + TARGET_DIR); GenericBuild(SCENES, TARGET_DIR + "/" + APP_NAME, BuildTargetGroup.WSA, BuildTarget.WSAPlayer, BuildOptions.AllowDebugging); } private static string[] FindEnabledEditorScenes() { List<string> EditorScenes = new List<string>(); foreach (EditorBuildSettingsScene scene in EditorBuildSettings.scenes) { if (!scene.enabled) continue; EditorScenes.Add(scene.path); } return EditorScenes.ToArray(); } private static void GenericBuild(string[] scenes, string app_target, BuildTargetGroup build_target_group, BuildTarget build_target, BuildOptions build_options) { EditorUserBuildSettings.SwitchActiveBuildTarget(build_target_group, BuildTarget.WSAPlayer); string res = BuildPipeline.BuildPlayer(scenes, app_target, build_target, build_options); if (res.Length > 0) { throw new Exception("BuildPlayer failure: " + res); } } /** * Get Arguments from the command line by name */ private static string GetArg(string name) { var args = System.Environment.GetCommandLineArgs(); for (int i = 0; i < args.Length; i++) { if (args[i] == name && args.Length > i + 1) { return args[i + 1]; } } return null; } } }
Но так как вы не хотите импортировать этот пакет в каждый ваш проект, пусть Jenkins импортирует его на лету.
Для этого я создал класс в пустом проекте.
и экспортировать это как AutoBuilder.unityproject
:
- right-clickна
Assets
и нажмитеExport package...
- Выберите место, где сохранить его
(я поставил подE:\UnityPackage\AutoBuilder.unitypackage
.)
Шаги сборки
Unity-Plugin
И MSBuild-Plugin
не работает хорошо для меня, так что я делаю каждый шаг в выделенном пакетном файле.
1. Импортировать пакет AutoBuild.unity в проект
Сначала нам нужно импортировать пакет before create unity to клонированный проект.
Бежать
<\Path\To\Your\Unity\Installation\>Editor\Unity.exe -quit -batchmode -username 'xxxxxxxxxxxxx' -password 'xxxxxxxxxxx' -logFile uniytImportLog.txt -importPackage E:\UnityPackage\AutoBuilder.unitypackage
Unity - Manual: аргументы командной строки
-quit
: Сделать выход из Unity после завершения импорта-batchmode
: Не открывайте / не загружайте графический интерфейс и сразу выходите из 1 при любой ошибке- (необязательно)
-username
и-password
: укажите свои учетные данные, чтобы Unity могла найти вашу лицензию (при необходимости) - (необязательно)
-logFile
: записать вывод в файл журнала (поскольку Unity в пакетном режиме его не показывает!) -importPackage
: Наконец скажите Unity, что делать; в этом случае импортируйте наш файл unitypackage (измените его на место, где вы сохранилиAutoBuilder.unitypackage
)
2. Запустите Unity-Build для Visual-Studio-Solution (.sln)
Теперь проект готов для сборки через командную строку для .sln
решения.
Бежать
<\Path\To\Your\Unity\Installation\>Editor\Unity.exe -quit -batchmode -username 'xxxxxxxxxxxxx' -password 'xxxxxxxxxxx' -logFile uniytBuildLog.txt -buildTarget wsaplayer -executeMethod JENKINS.AutoBuilder.PerformWindowsMixedRealityBuild -appName %JOB_NAME% -buildFolder %WORKSPACE%\00_BUILD
Unity - Manual: аргументы командной строки
-quit
: Сделать выход из Unity после завершения импорта-batchmode
: Не открывайте / не загружайте графический интерфейс и сразу выходите из 1 при любой ошибке- (необязательно)
-username
и-password
: укажите свои учетные данные, чтобы Unity могла найти вашу лицензию (при необходимости) - (необязательно)
-logFile
: записать вывод в файл журнала (поскольку Unity в пакетном режиме его не показывает!) -buildTarget
: Переключитесь на соответствующую цель сборки перед загрузкой проекта. Для пакетов приложений это, например,wsaplayer
-executeMethod
: Наконец скажите Unity, что делать; в этом случае выполните метод из нашего ранее импортированного класса AutoBuilder-appName %JOB_NAME%
и-buildFolder %WORKSPACE%\00_BUILD
: метод, который мы вызываем, принимает / требует аргументы из командной строки.-appName
звучит немного обманчиво, так как на самом деле это единственная подпапка, в которую будет строиться Unity.%JOB_NAME%
является глобальной переменной среды Jenkins для фактического имени задания.-buildFolder
является основной папкой, в которую будет собираться Unity.%WORKSPACE%
глобальная переменная среды Jenkins для текущей папки рабочего пространства Job.
ПРИМЕЧАНИЕ
Перед последними двумя последними шагами вы должны знать, как .sln
файл вызывается после Unity-Build.
Я буду предполагать, что что-то подобное YourProject.sln
хранится в переменной, App_Name
потому что это определено в Unity:
Перейти к Edit-> Project Settings-> Player Settings и изменитьProduct Name
3. Восстановите Nuget-пакеты (это был в основном шаг, который я пропустил раньше)
Чтобы восстановить nuget-пакеты (Visual-Studio обычно делает это автоматически при открытии решения в графическом интерфейсе), запустите
cmd.exe /C " chcp 1252 & <Path\To\Your\Visual-Studio\Installation>\MSBuild\15.0\Bin\msbuild.exe /m /t:restore /p:Configuration=Release /p:Platform=x86 "%WORKSPACE%\00_BUILD\%JOB_NAME%\%App_Name%" "
Справочник по командной строке MSBuild
/m
: Определяет максимальное количество одновременных процессов для использования при сборке. Если этот параметр не включен, значение по умолчанию равно 1. Если этот параметр включен без указания значения, MSBuild будет использовать вплоть до числа процессоров в компьютере./t
: Построить указанные цели в проекте./p
: Установите или переопределите указанные свойства уровня проекта, где name - это имя свойства, а value - значение свойства. (-> для голо-объектива этоConfiguration=Release
иPlattform=x86
)WORKSPACE
: Глобальная переменная среды Jenkins для текущей папки рабочего пространства Job00_BUILD
: мы передали это как параметр-buildFolder
шагу сборки Unity.JOB_NAME
: Глобальная переменная среды Jenkins для фактического имени заданияApp_Name
: как уже упоминалось ранее имя построенного Visual-Studio-Solution (.sln
)
Это только сделает восстановление и пока не построит проект.
4. Создайте окончательный пакет приложений с помощью MSBuild.
Мне не понравился MSBuild-Plugin
for jenkins, поэтому я сделал это в командном файле и использовал команду, созданную плагином ранее. Но выполнение этого в командном файле дало мне больше гибкости с точки зрения определения, например, целевого файла.
cmd.exe /C " chcp 1252 & <Path\To\Your\Visual-Studio\Installation>\MSBuild\15.0\Bin\msbuild.exe /m /t:restore /p:Configuration=Release /p:Platform=x86 "%WORKSPACE%\00_BUILD\%JOB_NAME%\%App_Name%" "
Справочник по командной строке MSBuild
/m
: Определяет максимальное количество одновременных процессов для использования при сборке. Если этот параметр не включен, значение по умолчанию равно 1. Если этот параметр включен без указания значения, MSBuild будет использовать вплоть до числа процессоров в компьютере./t
: Построить указанные цели в проекте./p
: Установите или переопределите указанные свойства уровня проекта, где name - это имя свойства, а value - значение свойства. (-> для голо-объектива этоConfiguration=Release
иPlattform=x86
)WORKSPACE
: Глобальная переменная среды Jenkins для текущей папки рабочего пространства Job00_BUILD
: мы передали это как параметр-buildFolder
шагу сборки Unity.JOB_NAME
: Глобальная переменная среды Jenkins для фактического имени заданияApp_Name
: как уже упоминалось ранее имя построенного Visual-Studio-Solution (.sln
)
После завершения вы должны иметь окончательный пакет приложений под
%WORKSPACE%\000_BUILD\%JOB_NAME%\%App_Name%\AppPackages