Vấn đề là tôi đã không khôi phục Nuget-Gói trước khi xây dựng bằng MSBuild. (Mở Visual-Studio trong GUI, có vẻ như sẽ tự động thực hiện bước này.)
Vì vậy, đây là giải pháp hoàn chỉnh từ gói dự án Unity đến gói ứng dụng Holo-Lens cuối cùng đã hoạt động với tôi:
Tạo gói Unity CommandLineBuild
Trước hết để có thể xây dựng một dự án Unity thông qua dòng lệnh bạn cần một lớp đặc biệt.
Điều này phải được đặt trong /Assets/Editor
dự án của bạn:
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;
}
}
}
Nhưng vì bạn không muốn nhập gói này cho mọi dự án bạn có, hãy để Jenkins nhập nó một cách nhanh chóng.
Do đó tôi đã tạo lớp trong một dự án trống
và xuất nó dưới dạng AutoBuilder.unityproject
:
- right-clickbật
Assets
và bấm vàoExport package...
- Chọn một vị trí để lưu nó vào
(Tôi đặt của tôi ở dưới E:\UnityPackage\AutoBuilder.unitypackage
.)
Xây dựng các bước
Các Unity-Plugin
và MSBuild-Plugin
đã không làm việc tốt cho tôi vì vậy tôi làm tất cả các bước trong một loạt file chuyên dụng.
1. Nhập AutoBuild.unitypackage vào dự án
Đầu tiên chúng ta cần nhập trước khi tạo unitypackage cho dự án nhân bản thực tế.
Chạy
<\Path\To\Your\Unity\Installation\>Editor\Unity.exe -quit -batchmode -username 'xxxxxxxxxxxxx' -password 'xxxxxxxxxxx' -logFile uniytImportLog.txt -importPackage E:\UnityPackage\AutoBuilder.unitypackage
Unity - Hướng dẫn: Đối số dòng lệnh
-quit
: Thực hiện thoát Unity sau khi kết thúc quá trình nhập
-batchmode
: Không mở / tải GUI và thoát 1 lỗi bất kỳ
- (tùy chọn)
-username
và -password
: Cung cấp thông tin đăng nhập của bạn để Unity có thể tra cứu Giấy phép của bạn (nếu cần)
- (tùy chọn)
-logFile
: Viết đầu ra vào logFile (vì Unity trong batchmode sẽ không hiển thị nó!)
-importPackage
: Cuối cùng hãy nói cho Unity biết phải làm gì; trong trường hợp này, nhập tệp unitypackage của chúng tôi (Thay đổi tệp này thành vị trí bạn đã lưu trữ AutoBuilder.unitypackage
)
2. Chạy Unity-Build to Visual-Studio-Solution (.sln)
Bây giờ dự án đã sẵn sàng để được xây dựng thông qua dòng lệnh để .sln
giải pháp.
Chạy
<\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 - Hướng dẫn: Đối số dòng lệnh
-quit
: Thực hiện thoát Unity sau khi kết thúc quá trình nhập
-batchmode
: Không mở / tải GUI và thoát 1 lỗi bất kỳ
- (tùy chọn)
-username
và -password
: Cung cấp thông tin đăng nhập của bạn để Unity có thể tra cứu Giấy phép của bạn (nếu cần)
- (tùy chọn)
-logFile
: Viết đầu ra vào logFile (vì Unity trong batchmode sẽ không hiển thị nó!)
-buildTarget
: Chuyển sang mục tiêu xây dựng theo trước khi tải dự án. Đối với các gói ứng dụng, vdwsaplayer
-executeMethod
: Cuối cùng hãy nói cho Unity biết phải làm gì; trong trường hợp này thực thi phương thức từ lớp AutoBuilder đã nhập trước của chúng tôi
-appName %JOB_NAME%
và -buildFolder %WORKSPACE%\00_BUILD
: Phương thức chúng ta gọi mất / yêu cầu đối số từ dòng lệnh.
-appName
Nghe có vẻ hơi sai vì nó thực sự chỉ là thư mục con mà Unity sẽ xây dựng. %JOB_NAME%
là biến môi trường Jenkins toàn cầu cho tên của Công việc thực tế.
-buildFolder
là thư mục chính mà Unity sẽ xây dựng. %WORKSPACE%
là biến môi trường Jenkins toàn cầu cho thư mục không gian làm việc thực tế của Công việc.
LƯU Ý
Trước hai bước cuối cùng sau đây, bạn phải biết cách .sln
tệp được gọi sau Unity-Build.
Tôi sẽ giả sử từ đây một cái gì đó giống như YourProject.sln
được lưu trữ cho biến App_Name
vì nó được định nghĩa trong Unity:
Chuyển đến Edit-> Project Settings-> Player Settings
và thay đổiProduct Name
3. Khôi phục gói Nuget (Đây chủ yếu là bước tôi đã bỏ lỡ trước đó)
Để khôi phục các gói nuget (Visual-Studio thường tự động thực hiện việc này khi mở giải pháp trong GUI) chạy
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%" "
Tham chiếu dòng lệnh MSBuild
/m
: Chỉ định số lượng tối đa các quy trình đồng thời sẽ sử dụng khi xây dựng. Nếu bạn không bao gồm công tắc này, giá trị mặc định là 1. Nếu bạn bao gồm công tắc này mà không chỉ định giá trị, MSBuild sẽ sử dụng tối đa số lượng bộ xử lý trong máy tính.
/t
: Xây dựng các mục tiêu được chỉ định trong dự án.
/p
: Đặt hoặc ghi đè các thuộc tính cấp dự án đã chỉ định, trong đó tên là tên thuộc tính và giá trị là giá trị thuộc tính. (-> cho Holo-Lens, nó Configuration=Release
và Plattform=x86
)
WORKSPACE
: Biến môi trường toàn cầu của Jenkins cho thư mục không gian làm việc thực tế của Công việc
00_BUILD
: chúng tôi đã trao thông số này làm tham số -buildFolder
cho bước xây dựng Unity.
JOB_NAME
: Biến môi trường toàn cầu của Jenkins cho tên Công việc thực tế
App_Name
: như đã đề cập trước tên của Visual-Studio-Solution ( .sln
)
Điều này sẽ chỉ làm khôi phục và chưa xây dựng dự án.
4. Xây dựng gói ứng dụng cuối cùng bằng MSBuild
Tôi không thích MSBuild-Plugin
jenkins vì vậy tôi đã tạo nó trong một tệp bó và sử dụng lệnh được tạo bởi Plugin trước đó. Nhưng thực hiện nó trong một tệp bó giúp tôi linh hoạt hơn về mặt định nghĩa, ví dụ như tệp đích.
cmd.exe /C " chcp 1252 & <Path\To\Your\Visual-Studio\Installation>\MSBuild\15.0\Bin\msbuild.exe /m /t:build /p:Configuration=Release /p:Platform=x86 "%WORKSPACE%\00_BUILD\%JOB_NAME%\%App_Name%" "
Tham chiếu dòng lệnh MSBuild
/m
: Chỉ định số lượng tối đa các quy trình đồng thời sẽ sử dụng khi xây dựng. Nếu bạn không bao gồm công tắc này, giá trị mặc định là 1. Nếu bạn bao gồm công tắc này mà không chỉ định giá trị, MSBuild sẽ sử dụng tối đa số lượng bộ xử lý trong máy tính.
/t
: Xây dựng các mục tiêu được chỉ định trong dự án.
/p
: Đặt hoặc ghi đè các thuộc tính cấp dự án đã chỉ định, trong đó tên là tên thuộc tính và giá trị là giá trị thuộc tính. (-> cho Holo-Lens, nó Configuration=Release
và Plattform=x86
)
WORKSPACE
: Biến môi trường toàn cầu của Jenkins cho thư mục không gian làm việc thực tế của Công việc
00_BUILD
: chúng tôi đã trao thông số này làm tham số -buildFolder
cho bước xây dựng Unity.
JOB_NAME
: Biến môi trường toàn cầu của Jenkins cho tên Công việc thực tế
App_Name
: như đã đề cập trước tên của Visual-Studio-Solution ( .sln
)
Sau khi hoàn thành, bạn nên có gói ứng dụng cuối cùng bên dưới
%WORKSPACE%\000_BUILD\%JOB_NAME%\%App_Name%\AppPackages