Unity3D-NPM提交流程
<p>[TOC]</p>
<table>
<thead>
<tr>
<th>最后修订日期</th>
<th>2023-11-24</th>
</tr>
</thead>
<tbody>
<tr>
<td>作者</td>
<td>林七佛</td>
</tr>
<tr>
<td>V1.3.0</td>
<td>创建文档</td>
</tr>
</tbody>
</table>
<h1>NPM 简介</h1>
<p>&nbsp;&nbsp;&nbsp;&nbsp;我们工程院使用的NPM的全称是<strong>Sonatype Nexus Repository Manager</strong>,它是一款强大的仓库管理器,可以用于存储和分发Maven、NuGet、npm、RubyGems等各种类型的软件包。它支持两种类型的仓库:代理仓库和托管仓库。</p>
<p>- 代理仓库:代理远程仓库,例如Maven Central,可以缓存远程仓库中的软件包,以减少对远程资源的依赖和提高本地开发的效率。
- 托管仓库:用于存储你自己开发的软件包,可以是私有的或公开的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;Nexus Repository Manager的主要特点包括:
1. 组件管理:Nexus Repository Manager可以帮助你管理和组织软件组件,提供了丰富的元数据,以便于搜索和发现。
2. 安全和许可证合规:Nexus Repository Manager可以集成Sonatype的CLM,提供组件的安全和许可证合规性检查。
3. 集成和自动化:Nexus Repository Manager提供了REST API,可以方便地集成到CI/CD流程中。</p>
<p>共享平台的NPM地址:[仓库管理地址](<a href="http://nexus.sdp.nd/">http://nexus.sdp.nd/</a> "仓库管理地址")</p>
<h1>说明</h1>
<p>&nbsp;&nbsp;&nbsp;&nbsp;虚拟实验室的组件构建和发包目前都是利用SDP进行的,下面的文档也是基于SDP服务。
此外,我们也编写了一些构建脚本,在本示例中都会给出说明。</p>
<h2>前置工作</h2>
<p>&nbsp;&nbsp;&nbsp;&nbsp;Unity NPM发包的流程是针对U3D的UPM包的,所以我们从构建UPM包开始(构建的最后一个流程包括发NPM包),这里我们以[虚拟实验室]的[物件播放组件vlab-equipmentplayer]为例。<strong>如果只对发UPM包有兴趣,可以直接搜索npm publish命令</strong></p>
<h3>确保共享平台已创建U3D组件</h3>
<p>[共享平台平台地址](<a href="https://d.101.com/">https://d.101.com/</a> "共享平台地址")
请确保已经在共享平台上创建好【U3D组件】,如果没有就需要有权限的帮忙新建一个
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=b85a8efdb2fbc46a109d6ecf9eebd9e6&amp;file=file.png" alt="" /></p>
<h3>确保工程目录中的代码结构符合UnityPackage包的规范</h3>
<p>具体请参考[Unity官网](<a href="https://docs.unity.cn/cn/2019.4/Manual/cus-layout.html">https://docs.unity.cn/cn/2019.4/Manual/cus-layout.html</a> "Unity官网")</p>
<h3>确保生产管理平台上有权限</h3>
<p>可以打开下面的链接查看权限,若无权限,可以找林瑶申请</p>
<p>[生产管理平台地址](<a href="https://vlab-mes-web.sdp.101.com/">https://vlab-mes-web.sdp.101.com/</a>#/ "流程工具地址")
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=d1dfd023ddbaf564709c8cf7afeaa8f3&amp;file=file.png" alt="" /></p>
<h2>类型实验室作为基础组件添加到流程平台</h2>
<h3>新增基础组件</h3>
<p>[实验资源数据看板 (101.com)](<a href="https://nd99u.site.101.com/bcs/#/app-sharing/c1dab7c4669640ab9615a8d54e2c0ecf?&_share=true&bcsAppId=c1dab7c4669640ab84f76c5cd8c2cae4">https://nd99u.site.101.com/bcs/#/app-sharing/c1dab7c4669640ab9615a8d54e2c0ecf?&_share=true&bcsAppId=c1dab7c4669640ab84f76c5cd8c2cae4</a> "实验资源数据看板 (101.com)")</p>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=3cdcae89f8a4b142c7f27d4cb35a7e07&amp;file=file.png" alt="" /></p>
<p><strong>填写说明</strong>
组件编码:同共享平台组件编码,比如本页第一张图vlab-equipmentplayer
SDP组件ID:同共享平台组件URL中的appid字段,参考本页第一张图的appId=652dfad729d65d021d015d30
SDP组件名称:同共享平台组件的名称
组件包ID集合:共享平台申请组件时用了namespace + "." + 组件编码
组件类型:根据类型选择交互或者播放</p>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=e6a73e79c7b3a3355b3ab4780c10adcc&amp;file=file.png" alt="" /></p>
<h3>创建版本</h3>
<p>[入口地址](<a href="https://vlab-mes-web.sdp.101.com/">https://vlab-mes-web.sdp.101.com/</a>#/ "入口地址")</p>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=6518f5c7686acdb23879182aa05a4f97&amp;file=file.png" alt="" /></p>
<p>选择生产线:未来实验室基础组件研发
开发负责人:选择自己,注意这里选谁,单据就会下单到谁
是否需要测试:这里选择否
然后填上其余必要信息</p>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=40489f3c557584cad69c7c1ad04f2df5&amp;file=file.png" alt="" /></p>
<p>提交后就可以下单到负责人</p>
<h3>跑通线上构建流程</h3>
<h4>构建流程说明</h4>
<p>构建时生产管理平台会发送对应的构建请求给到共享平台</p>
<pre><code class="language-plantuml">@startuml
node 生产管理平台
node 共享平台
生产管理平台 ...&gt; 共享平台
</code></pre>
<p>共享平台jekins构建流程(含发NPM包)</p>
<pre><code class="language-plantuml">@startuml
start
:拉取代码;
:BeforeBuild.bat;
:Build sln;
:Nuget publish;
:AfterBuild.bat;
end
@enduml
</code></pre>
<p>工程目录结构如下所示:
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=14e20c226704e403ebf76d8499d4d4ca&amp;file=file.png" alt="" /></p>
<p>BeforeBuild.bat 对应的是U3dBuildBeforeHook.bat
Build sln 对应的是调用工程目录下的 【组件id】.sln文件来构建
Nuget publish 对应的是调用工程目录下的【组件id】.nuspec 文件来发布nuget包
AfterBuild.bat 对应的是调用工程目录下的U3dBuildBeforeHook.bat</p>
<h4>基于上述流程,类型实验室组件的构建原理是:</h4>
<p>目标是要要将类型实验室的代码发布Unity的pakcage包【UPM包】到工程院的NPM服务器上,因此
第一步:使用构建时的版本号,package内容如下</p>
<pre><code>{
&quot;name&quot;: &quot;com.nd.vlab-equipmentplayer&quot;,
&quot;displayName&quot;: &quot;vlab-equipmentplayer&quot;,
&quot;version&quot;: &quot;0.0.0-Version&quot;,
&quot;dependencies&quot;: {
}
}</code></pre>
<p>修改U3dBuildBeforeHook</p>
<pre><code>git clean -fd
git reset --hard
@echo off &amp; setlocal enabledelayedexpansion
rem set Version=1.2.3-pred_kdjfdkf
rem set CommitId=dd122343
cd /d %~dp0
for /f &quot;eol=* tokens=*&quot; %%j in (package.json) do (
set a=%%j
set &quot;a=!a:0.0.0-Version=%Version%!&quot;
echo !a!
echo !a!&gt;&gt;$
)
move $ package.json
</code></pre>
<p>第二步:【Build sln】是共享平台一定要调用的,因此可以提供空的sln文件(如果要进行Sonar静态代码检查、代码覆盖率等,空的sln就不行了),保证构建能成功,不报错就行。
构建过程如果遇到问题,可以从反馈的日志文件中分析问题并解决。</p>
<pre><code>Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.32413.511
MinimumVisualStudioVersion = 10.0.40219.1
Global
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {DA2BAD2E-4048-424B-A0D8-74E39B53386F}
EndGlobalSection
EndGlobal
</code></pre>
<p>第三步:添加.nugspec文件【Nuget publish】是共享平台一定要调用的,因此可以把当前组件的package.json文件发布到nuget上</p>
<pre><code>&lt;?xml version='1.0' encoding='UTF-8'?&gt;
&lt;package&gt;
&lt;metadata&gt;
&lt;id&gt;$ID$&lt;/id&gt;
&lt;version&gt;$VERSION$&lt;/version&gt;
&lt;title&gt;vlab-equipmentplayer&lt;/title&gt;
&lt;authors&gt;HuangJinmin&lt;/authors&gt;
&lt;owners&gt;HuangJinmin&lt;/owners&gt;
&lt;iconUrl&gt;https://litjson.net/assets/img/logo.png&lt;/iconUrl&gt;
&lt;requireLicenseAcceptance&gt;false&lt;/requireLicenseAcceptance&gt;
&lt;description&gt;vlab-equipmentplayer&lt;/description&gt;
&lt;releaseNotes&gt;
&lt;/releaseNotes&gt;
&lt;copyright&gt;Copyright 2018&lt;/copyright&gt;
&lt;tags&gt;vlab-equipmentplayer&lt;/tags&gt;
&lt;/metadata&gt;
&lt;files&gt;
&lt;file src=&quot;package.json&quot; target=&quot;ref\npm\vlab-equipmentplayer\&quot; /&gt;
&lt;/files&gt;
&lt;/package&gt;</code></pre>
<p>第四步: 发布UPM包工程院的服务器上,在【AfterBuild.bat】中处理</p>
<pre><code>del /Q jenkins_build_info.log
npm publish</code></pre>
<p>第五步:可选,配置【.npmignore】文件,忽略不想发布到服务器上的文件</p>
<p>后续接入可以参考已经成功的样例:物件播放器配置方法
<a href="http://gerrit.sdp.nd/component-dll/vlab-equipmentplayer">http://gerrit.sdp.nd/component-dll/vlab-equipmentplayer</a></p>
<p>按照上述思路提交代码后,可以尝试构建,直到构建成功,这步是最难的一步,有任何疑问可以咨询七佛或张煜园</p>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=7c0f229fe972c7c21dd45484737477f2&amp;file=file.png" alt="" /></p>
<h3>构建结果确认</h3>
<p>待构建成功后,可以到这个地址查看UPM包是否存在,如果存在就可以在Unity的PackageManager中看到对应的包
<a href="http://nexus.sdp.nd/repository/unity-upm/">http://nexus.sdp.nd/repository/unity-upm/</a></p>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=0ca3ddb1f67ffc08e370976ffa1bf833&amp;file=file.png" alt="" /></p>
<h3>为工程添加package</h3>
<h4>1.点击windows,选中Package Manager 可以看到刚发布的packager包,右下选择install</h4>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=65f600212ac2f8e028a1bc85f9b3eb22&amp;file=file.png" alt="" /></p>
<h4>2.手动修改配置文件</h4>
<pre><code>如果在upm上能查到包,但是unity工程中的Package Manager查不到的话,可以通过修改配置文件来添加包</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=2419fd26426973980159d89a49c73116&amp;file=file.png" alt="" /></p>
<pre><code>manifest中
&quot;dependencies&quot;字段下添加
&quot;com.nd.vlab-equipmentplayer&quot;: &quot;0.0.9-pre0&quot;</code></pre>
<pre><code>packages-lock中
&quot;dependencies&quot;字段下添加
&quot;com.nd.vlab-equipmentplayer&quot;: {
&quot;version&quot;: &quot;0.0.9-pre0&quot;,
&quot;depth&quot;: 0,
&quot;source&quot;: &quot;registry&quot;,
&quot;dependencies&quot;: {},
&quot;url&quot;: &quot;http://nexus.sdp.nd/repository/unity-upm&quot;
}</code></pre>
<h3>其他实验室组件参考样例</h3>
<p>Action组件-原由金民负责设计,后交接周竑(2023-10)。</p>
<h3>参考资料</h3>
<p><a href="https://www.showdoc.com.cn/VLab/9620843670268100">https://www.showdoc.com.cn/VLab/9620843670268100</a>
<a href="https://www.showdoc.com.cn/VLab/9569593866775911">https://www.showdoc.com.cn/VLab/9569593866775911</a>
<a href="https://www.showdoc.com.cn/VLab/9751206536322905">https://www.showdoc.com.cn/VLab/9751206536322905</a></p>