天天带着笔记本太重了,那么有没有更好的方法实现在不同的地方有统一的工作环境呢
代码可以远程同步,但也不是能完全保持一致的环境,因为还有IDE和缓存等,总不能把系统所有目录都提交同步吧
我想到 3 种方法,但都有其优缺点
以前我是用 WTG(Windows To Go),把整个系统都装在移动硬盘上,用了一段时间也算不错, 但是新添了 AMD 平台设备后,才发现 WTG 在 Intel 和 AMD 上不通用,驱动冲突。
缺点是 平台不通用;以及激活问题,需要使用 KMS 激活,通常都不是永久激活。
把东西装进虚拟机,可以把虚拟机系统的虚拟磁盘放到移动硬盘,也可把物理磁盘设置为虚拟机的磁盘。
缺点是 由于虚拟化层的存在,虚拟机通常比直接在物理硬件上运行稍微慢一些。
将软件、配置、缓存,及 Workspaces 装在移动硬盘上,再写个脚本在新设备上也能把环境变量一键配置好, 多个设备也可以实现统一的环境,工作不受设备限制打断
缺点是 每一个新设备都需要配置一次环境和盘符等
一盘在手,天下我有
以下是 方案3 的使用
手动复制一份配置到用户目录下 C:\Users\xmo\.ssh
或手动添加其它路径的密钥
ssh-add ~/.ssh/id_rsa
查看手动添加的密钥
ssh-add -L
、eval "$(ssh-agent -s)"
手动复制一份配置到用户目录下 C:\Users\xmo\.gitconfig
可以设置变量 HOME
将 Git 的配置 .gitconfig
放到指定目录下,但可能会影响其它(测试后再改)
环境变量
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_HOME
Z:\AwesomeProgram\Android\sdk
# 默认在用户目录下的 `.android`
ANDROID_SDK_HOME
Z:\AwesomeProgram\Android
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}/conf
的 settings.xml
找到以下标签并修改路径后复制到对应位置
<localRepository>Z:\.repo\.m2\repository</localRepository>
这里不用
${user}/.m2/settings.xml
是不需要在每个设备再多设置一遍,只需要插上硬盘执行后面的脚本就可以了
发现 IDEA 会有出现依然使用
${user}/.m2
的情况,但问题不大
gradle 目录 Z:\.repo\.gradle
# `.gradle`
GRADLE_USER_HOME
Z:\.repo\.gradle
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 目前只能安装在 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,虽然不完美但问题不大
需要利用开源工具 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
%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
还有一些其它的在安装时会自动生成环境变量
设置里支持修改 虚拟机的默认位置,设置为 Z:\VMware\
,已有的虚拟机直接从自己虚拟机的目录打开就行
在设置里可以更改镜像和容器目录,设置为 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
为谨慎起见,也可以手动设置环境变量
修改 ${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 指定新链接引用的路径
(相对或绝对)。