<
打造一致的 windows 多设备移动开发环境
>
上一篇

Git 报错 因代理或缓冲区等问题失败的解决办法
下一篇

Ssh 指定不使用公钥验证

打造一致的 Windows 多设备移动开发环境(仅供参考,我是开发 Android 及相关的)

天天带着笔记本太重了,那么有没有更好的方法实现在不同的地方有统一的工作环境呢

代码可以远程同步,但也不是能完全保持一致的环境,因为还有IDE和缓存等,总不能把系统所有目录都提交同步吧

我想到 3 种方法,但都有其优缺点

  1. WTG

以前我是用 WTG(Windows To Go),把整个系统都装在移动硬盘上,用了一段时间也算不错, 但是新添了 AMD 平台设备后,才发现 WTG 在 Intel 和 AMD 上不通用,驱动冲突。

缺点是 平台不通用;以及激活问题,需要使用 KMS 激活,通常都不是永久激活。

  1. VMWare

把东西装进虚拟机,可以把虚拟机系统的虚拟磁盘放到移动硬盘,也可把物理磁盘设置为虚拟机的磁盘。

缺点是 由于虚拟化层的存在,虚拟机通常比直接在物理硬件上运行稍微慢一些。

  1. 把工作环境装进移动硬盘,使用脚本快速配置环境变量

将软件、配置、缓存,及 Workspaces 装在移动硬盘上,再写个脚本在新设备上也能把环境变量一键配置好, 多个设备也可以实现统一的环境,工作不受设备限制打断

缺点是 每一个新设备都需要配置一次环境和盘符等


一盘在手,天下我有

以下是 方案3 的使用

SSH

手动复制一份配置到用户目录下 C:\Users\xmo\.ssh

或手动添加其它路径的密钥 ssh-add ~/.ssh/id_rsa

查看手动添加的密钥 ssh-add -Leval "$(ssh-agent -s)"

Git

手动复制一份配置到用户目录下 C:\Users\xmo\.gitconfig

可以设置变量 HOME 将 Git 的配置 .gitconfig 放到指定目录下,但可能会影响其它(测试后再改)

Java

环境变量

JAVA_HOME
%JAVA_HOME_17%
JAVA_HOME_8
Z:\AwesomeProgram\Java\openjdk-8
JAVA_HOME_11
Z:\AwesomeProgram\Java\openjdk-11
JAVA_HOME_17
Z:\AwesomeProgram\Java\openjdk-17

CLASS_PATH
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

Android

ANDROID_HOME
Z:\AwesomeProgram\Android\sdk

# 默认在用户目录下的 `.android` 
ANDROID_SDK_HOME
Z:\AwesomeProgram\Android

Maven

maven 仓库 目录 Z:\.repo\.m2

# 默认在用户目录下的 `.m2` 另外需要设置 `${M2_HOME}/conf` 的 `settings.xml`
# `settings.xml` 配置文件加载顺序 `${user}/.m2` --> `${M2_HOME}/conf` -->
MAVEN_HOME
Z:\AwesomeProgram\apache-maven-3.6.3

M2_HOME
%MAVEN_HOME%

${M2_HOME}/confsettings.xml 找到以下标签并修改路径后复制到对应位置

<localRepository>Z:\.repo\.m2\repository</localRepository>

这里不用 ${user}/.m2/settings.xml 是不需要在每个设备再多设置一遍,只需要插上硬盘执行后面的脚本就可以了

发现 IDEA 会有出现依然使用 ${user}/.m2 的情况,但问题不大

Gradle

gradle 目录 Z:\.repo\.gradle

# `.gradle`
GRADLE_USER_HOME
Z:\.repo\.gradle

Flutter

FLUTTER_HOME
Z:\AwesomeProgram\flutter
FLUTTER_HOME_223
Z:\AwesomeProgram\flutter223

FLUTTER_STORAGE_BASE_URL
https://storage.flutter-io.cn

PUB_HOSTED_URL
https://pub.flutter-io.cn

我有多个项目,旧项目只能用 2.2.3

SourceTree

SourceTree 目前只能安装在 C 盘,而且未找到配置目录的修改方法

以下是相关目录

APP目录
${user_home}\AppData\Local\SourceTree

配置文件目录
${user_home}\AppData\Local\Atlassian\SourceTree
保存的仓库的书签
${user_home}\AppData\Local\Atlassian\SourceTree\bookmarks.xml
打开的标签页
${user_home}\AppData\Local\Atlassian\SourceTree\opentabs.xml

目前只能安装在 C 盘,书签有需要的时候 copy,虽然不完美但问题不大

WSL

需要利用开源工具 LxRunOffline,在 github 上搜

# WSL 安装目录迁移
# 查看现有的WSL信息
LxRunOffline.exe list
# 迁移到目标地址:-n指定WSL,-d指定目标地址
LxRunOffline.exe move -n Ubuntu_20.04_LTS_1 -d D:\WSL\Ubuntu_20.04_LTS_1
# ...
# 接着等待迁移,期间的WARNING请忽略
# ...
# 查看迁移后的地址,观察是否迁移成功
LxRunOffline.exe get-dir -n Ubuntu_20.04_LTS_1

# 备份
lxrunoffline e -n <WSL名称> -f <压缩包路径>.tar.gz

# 恢复
lxrunoffline i -n <WSL名称> -d <安装路径> -f <压缩包路径>.tar.gz

把 WSL 放到移动硬盘,之后可以写个脚本一键注册,在新安装好WSL的设备上就能用了

新建脚本 Ubuntu_20.04_LTS_1 注销(不会删除WSL数据).bat

@echo off & title  %cd%
%cd%\LxRunOffline.exe ur -n Ubuntu_20.04_LTS_1
pause

新建脚本 Ubuntu_20.04_LTS_2 注册.bat

@echo off & title  %cd%
%cd%\LxRunOffline.exe rg -n Ubuntu_20.04_LTS_2 -d %cd%\Ubuntu_20.04_LTS_2 -c %cd%\Ubuntu_LTS_2.xml
pause

Path 环境变量

以上都设置了自己的变量,但未赋值给系统 Path

Path

%FLUTTER_HOME%\bin

%ANDROID_HOME%\cmdline-tools\latest\bin
%ANDROID_HOME%\emulator
%ANDROID_HOME%\platform-tools
%ANDROID_HOME%\tools
%ANDROID_HOME%\tools\bin

%JAVA_HOME%\bin
%JAVA_HOME%\jre\bin
Z:\Workspaces\mine\script\bat
Z:\Workspaces\mine\script\shell
Z:\AwesomeProgram\LxRunOffline-v3.5.0-mingw
Z:\AwesomeProgram\docker-compose.exe

还有一些其它的在安装时会自动生成环境变量

Vmware

设置里支持修改 虚拟机的默认位置,设置为 Z:\VMware\,已有的虚拟机直接从自己虚拟机的目录打开就行

Docker

在设置里可以更改镜像和容器目录,设置为 Z:\Docker,会在此目录下自动生成 Z:\Docker\DockerDesktopWSL,设置后会自动迁移到新目录

目前不建议修改,多个设备无法使用同一目录 会提示 xx already exists. Please remove it and retry.

环境变量完整脚本

设置环境变量的脚本 新设置环境变量(以管理员身份运行).bat

@echo off  

:: 右击 以管理员身份运行 ( 手动在命令行窗口 CMD 里执行需要将 `%%` 替换为 `^%` )

choice /m "此脚本没有检查 Path 变量重复路径,执行前请检查环境变量值,请确认继续按Y,否则取消执行按N"
if %errorlevel%==1 goto start
if %errorlevel%==2 goto end

:: ####################

:start

echo\

echo 开始执行

:: ####################

:: 环境变量不会在本次执行期间赋值生效

:: 借助 临时变量 设置 Path

set TEMP_Path=%Path%

:: ####################

:: # Java

setx /m JAVA_HOME_8 Z:\AwesomeProgram\Java\openjdk-8
setx /m JAVA_HOME_11 Z:\AwesomeProgram\Java\openjdk-11
setx /m JAVA_HOME_17 Z:\AwesomeProgram\Java\openjdk-17
setx /m JAVA_HOME %%JAVA_HOME_17%%

setx /m CLASS_PATH .;%%JAVA_HOME%%\lib;%%JAVA_HOME%%\lib\dt.jar;%%JAVA_HOME%%\lib\tools.jar;

set TEMP_Path=%TEMP_Path%;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

:: ####################

:: # Android

setx /m ANDROID_HOME Z:\AwesomeProgram\Android\sdk

set TEMP_Path=%TEMP_Path%;%ANDROID_HOME%\cmdline-tools\latest\bin;%ANDROID_HOME%\emulator;%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools;%ANDROID_HOME%\tools\bin

:: # `.android`
setx /m ANDROID_SDK_HOME Z:\AwesomeProgram\Android

:: ####################

:: # Maven

setx /m MAVEN_HOME Z:\AwesomeProgram\apache-maven-3.6.3
setx /m M2_HOME %%MAVEN_HOME%%

set TEMP_Path=%TEMP_Path%;%MAVEN_HOME%\bin

:: ####################

:: # Gradle

setx /m GRADLE_USER_HOME Z:\.repo\.gradle

:: ####################

:: # Flutter

setx /m FLUTTER_HOME Z:\AwesomeProgram\flutter
setx /m FLUTTER_HOME_223 Z:\AwesomeProgram\flutter223

setx /m FLUTTER_STORAGE_BASE_URL https://storage.flutter-io.cn
setx /m PUB_HOSTED_URL https://pub.flutter-io.cn

set TEMP_Path=%TEMP_Path%;%FLUTTER_HOME%\bin

:: ####################

:: # Others

set TEMP_Path=%TEMP_Path%;Z:\Workspaces\mine\script\bat
set TEMP_Path=%TEMP_Path%;Z:\Workspaces\mine\script\shell

set TEMP_Path=%TEMP_Path%;Z:\AwesomeProgram\LxRunOffline-v3.5.0-mingw

set TEMP_Path=%TEMP_Path%;Z:\AwesomeProgram\docker-compose.exe

:: ####################

:: # 最终设置 Path

setx /m Path %TEMP_Path%

:: ####################

echo\
echo 执行完毕
echo\

:end

pause

为谨慎起见,也可以手动设置环境变量

IDE(IDEA、Android Studio、DevEco Studio 等)

修改 ${idea.home.path}/bin/idea.properties

# 版本不再更新补丁版本后将配置保存到 ${idea.home.path}/data
# 这里指定是类似 android-studio-4.2.x 或 android-studio-2022.3.1.x 这样的版本,后面的 x 是补丁版本,
# idea.config.path=${idea.home.path}/data/config
# idea.system.path=${idea.home.path}/data/system

# 版本还会更新补丁版本时暂时把配置保存到 ${idea.home.path} 外层的位置
idea.config.path=${idea.home.path}/../config/2022.3.1/config
idea.system.path=${idea.home.path}/../config/2022.3.1/system

可以将 IDE 及其配置和插件等 放到移动硬盘指定目录下

JetBrains 产品及其衍生品都差不多


迁移整个 Users 目录,使用软连接将 C 盘用户目录链接到其它盘符的位置,未测试 OneDrive 等特殊目录能否正常使用

参考 https://blog.csdn.net/h_bpdwn/article/details/112258349

创建目录软链接

mklink /J "C:\Users" "D:\Users"

命令说明

MKLINK [[/D] | [/H] | [/J]] Link Target

        /D      创建目录符号链接。默认为文件
                符号链接。
        /H      创建硬链接而非符号链接。
        /J      创建目录联接。
        Link    指定新的符号链接名称。
        Target  指定新链接引用的路径
                (相对或绝对)。
Top
Foot