作為一名使用 win10 的開發者,搭建開發環境往往是一件比較痛苦的事,需要從網上下載各種軟件,在電腦上配置不同軟件運行環境,對軟件進行各種設置,不僅耗時,而且容易出現各種問題。搭建的環境還會存在下面一些問題:
為了解決上面這些問題,我們可以使用 WSL+Docker+Scoop 搭建開發環境,取代通過圖形界面安裝軟件和 VMware 安裝 Linux 環境的傳統方式。
WSL 是適用于 Linux 的 Windows 子系統, 可讓開發人員按原樣運行 GNU/Linux 環境 - 包括大多數命令行工具、實用工具和應用程序 - 且不會產生傳統虛擬機或雙啟動設置開銷。
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的 Linux 機器或 Windows 機器上。
Scoop 是 Windows 的命令行安裝程序,可以讓我們從命令行以最小的安裝量安裝程序, 它消除了安裝界面和安裝程序造成的路徑污染,它安裝和卸載軟件只需一行命令就可以完成,它還可以隨意切換軟件的版本。
一個完整的開發環境組成:首先使用 WSL 搭建一個 Linux 環境,然后在 Linux 環境里安裝 Docker 應用,使用 Docker 來安裝一些常用軟件,比如數據庫、web 環境等,Scoop 則是在本機上安裝一些開發用到的軟件,比如 jdk、maven、idea 等。WSL 和 Scoop 都是比較容易備份和還原的,這兩個搭建好了,我們利用備份還原可以快速在另一臺機器上搭建同樣的一套環境,下面是搭建環境的具體流程。
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
wsl --set-default-version 2
WSL 每次啟動后,windows 都會給它分配一個隨機的 IP 地址,這樣是不利于我們訪問 docker 里的服務的,為了解決這個問題,我們可以創建一個腳本文件 wsl2-ip.bat來給 wsl 分配一個固定的 IP,在每次啟動 wsl 后用管理員權限運行這個腳本,文件內容如下:
@echo off
setlocal enabledelayedexpansion
:: set wsl2 ip
wsl -u root ip addr | findstr "192.168.169.2" > nul
if !errorlevel! equ 0 (
echo wsl ip has set
) else (
wsl -d Ubuntu-20.04 -u root ip addr add 192.168.169.2/28 broadcast 192.168.169.15 dev eth0 label eth0:1
echo set wsl ip success: 192.168.169.2
)
:: set windows ip
ipconfig | findstr "192.168.169.1" > nul
if !errorlevel! equ 0 (
echo windows ip has set
) else (
netsh interface ip add address "vEthernet (WSL)" 192.168.169.1 255.255.255.240
echo set windows ip success: 192.168.169.1
)
pause
其中 192.168.169.2 表示 Linux 的 IP 地址, 192.168.169.1 表示主機的 IP 地址。
有時會遇到 Ubuntu 20.04 LTS 無法連接網絡,這個非常重要,我們可以運行下面命令解決:
sed -i '4d' /etc/resolv.conf
sed -i '3a\nameserver 8.8.8.8' /etc/resolv.conf
sed -i '4a\nameserver 114.114.114.114' /etc/resolv.conf
mv /etc/apt/sources.list /etc/apt/sources.list.bak
vim /etc/apt/sources.list
# 清華源
# 默認注釋了源碼鏡像以提高 apt update 速度,如有需要可自行取消注釋
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# 預發布軟件源,不建議啟用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# 阿里源
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
# 中科大源
deb https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
#deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
#deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
#deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
#deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
#deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
#網易163源
deb http://mirrors.163.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ focal-backports main restricted universe multiverse
#deb-src http://mirrors.163.com/ubuntu/ focal main restricted universe multiverse
#deb-src http://mirrors.163.com/ubuntu/ focal-security main restricted universe multiverse
#deb-src http://mirrors.163.com/ubuntu/ focal-updates main restricted universe multiverse
#deb-src http://mirrors.163.com/ubuntu/ focal-proposed main restricted universe multiverse
#deb-src http://mirrors.163.com/ubuntu/ focal-backports main restricted universe multiverse
apt update
apt upgrade -y
apt install -y fontconfig daemonize
SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')
if [ -z "$SYSTEMD_PID" ]; then
sudo /usr/bin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')
fi
if [ -n "$SYSTEMD_PID" ] && [ "$SYSTEMD_PID" != "1" ]; then
exec sudo /usr/bin/nsenter -t $SYSTEMD_PID -a su - $LOGNAME
fi
%sudo ALL=(ALL) NOPASSWD: /usr/sbin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
%sudo ALL=(ALL) NOPASSWD: /usr/bin/nsenter -t [0-9]* -a su - [a-zA-Z0-9]*
source /etc/profile
passwd root
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sed -i '15c Port 22' /etc/ssh/sshd_config
sed -i '17c ListenAddress 0.0.0.0' /etc/ssh/sshd_config
sed -i '34c PermitRootLogin yes' /etc/ssh/sshd_config
sed -i '58c PasswordAuthentication yes' /etc/ssh/sshd_config
systemctl restart sshd
官方和阿里的源選擇其一,建議使用阿里源,速度快。
apt-get remove docker docker-engine docker.io containerd runc
apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io
apt-mark hold docker-ce docker-ce-cli containerd.io
apt-get remove docker docker-engine docker.io containerd runc
apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io
apt-mark hold docker-ce docker-ce-cli containerd.io
創建 /etc/docker/daemon.json 文件,并填寫以下內容:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"]
}
$env:SCOOP='D:\Softwares\Scoop\LocalApps'
[Environment]::SetEnvironmentVariable('SCOOP', $env:SCOOP, 'User')
$env:SCOOP_GLOBAL='D:\Softwares\Scoop\GlobalApps'
[Environment]::SetEnvironmentVariable('SCOOP_GLOBAL', $env:SCOOP_GLOBAL, 'Machine')
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
scoop install sudo
sudo scoop install 7zip git innounp dark -g
scoop checkup
Add-MpPreference -ExclusionPath 'D:\Softwares\Scoop\LocalApps'
Add-MpPreference -ExclusionPath 'D:\Softwares\Scoop\GlobalApps'
Set-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem' -Name 'LongPathsEnabled' -Value 1
scoop bucket add extras
scoop bucket add versions
scoop bucket add nightlies
scoop bucket add nirsoft
scoop bucket add php
scoop bucket add nerd-fonts
scoop bucket add nonportable
scoop bucket add java
scoop bucket add games
scoop bucket add jetbrains
scoop bucket add dorado https://github.com/chawyehsu/dorado
scoop bucket add Ash258 https://github.com/Ash258/Scoop-Ash258.git
scoop bucket add pleiades https://github.com/jfut/scoop-pleiades.git
scoop bucket add Scoop-Apps https://github.com/ACooper81/scoop-apps
scoop bucket add scoop-zapps https://github.com/kkzzhizhou/scoop-zapps
scoop bucket add lemon https://github.com/hoilc/scoop-lemon
scoop bucket add raresoft https://github.com/L-Trump/scoop-raresoft
如果軟件倉庫添加失敗,還是因為網絡的原因,大家可以把這些倉庫 fork 到自己的碼云賬戶下,然后再添加。
scoop install aria2 -g
scoop config aria2-max-connection-per-server 16
scoop config aria2-split 16
scoop config aria2-min-split-size 1M
如果想關閉 aria2,可以運行 scoop config aria2-enabled false命令。
# 搜索app
scoop search <應用名>
# 檢查哪些軟件有更新
scoop status
# 版本切換
scoop reset <應用名>@<版本切換>
# 禁止某app更新
scoop hold <應用名>
# 更新所有app
scoop update *
# 安裝app
scoop install <應用名>
#全局安裝app
scoop install -g <應用名>
#安裝extras軟件源下的app
scoop install extras/<應用名>
# 卸載app
scoop uninstall <應用名>
# 卸載全局安裝的app
scoop uninstall -g <應用名>
開發環境軟件的安裝與配置到這里就完成了,利用上面這些軟件,你可以快速搭建 Java、Go、C++、Python等開發環境。
[1] Linux內核更新包: https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
[2] Microsoft Store: https://aka.ms/wslstore
[3] Ubuntu 20.04 LTS: https://www.microsoft.com/store/apps/9n6svws3rx71
[4] IP地址查詢網站: https://www.ipaddress.com/
今天的這期IT之家學院,我們來討論如何在Windows 10中創建環境變量。Windows中的環境變量是包含有關系統環境和當前登錄用戶信息的值。除了Windows之外,環境變量也存在于微軟之前的操作系統中,例如MS-DOS。
正如我們所知道的,應用程序或者服務可以通過環境變量所定義的信息來確定有關操作系統的各種內容,例如進程的數量、當前登錄用戶的名稱、當前用戶配置文件的文件夾路徑或臨時文件目錄等。
Windows 10中有多種類型的環境變量,本期文章,我們要討論的是如何創建用戶環境變量和系統環境變量。用戶環境變量是一種適用于在Windows 10中登錄的當前用戶的環境變量,系統環境變量則是適用于Windows 10中所有用戶的環境變量。
在注冊表編輯器(regedit)中,我們可以找到有關環境變量的注冊表項,其中,用戶環境變量被存儲在以下注冊表項下:
\HKEY_CURRENT_USER\Environment
而系統環境變量則被存儲在以下注冊表項下:
\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
下面,我們對創建用戶環境變量和創建系統環境變量分別來做討論。
一、創建用戶環境變量
在Windows 10中創建環境變量的方法并不唯一,在今天的這期文章當中,我們將討論三種方法,分別是通過控制面板創建、通過命令提示符(CMD)創建和通過創建。
1、通過圖形界面創建
要通過圖形界面創建用戶環境變量,請按照以下的步驟操作。
點擊“開始”按鈕右側的搜索框/搜索按鈕,或者通過“Win+S”組合鍵喚出Windows Search,搜索并打開“控制面板”;
依次點擊“用戶賬戶”-“用戶賬戶”,直至到達這一頁面:
點擊窗口左側的“更改我的環境變量”鏈接,控制面板將彈出窗口如下:
點擊窗口中段的“新建”按鈕,此時將彈出一個“新建用戶變量”窗口如下:
輸入要創建的變量名以及要分配給它的變量值。如果我們不想手動輸入,那么我們也可以通過通過點擊窗口左下方的兩個按鈕來瀏覽目錄或者瀏覽文件。
用戶環境變量的變量名和變量值設置完成后,請點擊“新建用戶變量”右下角的“確定”按鈕來完成創建。
要驗證剛剛的用戶環境變量有沒有創建成功,我們可以打開命令提示符(在Windows Search中搜索關鍵字“CMD”),然后輸入并執行如下命令:
echo %剛剛創建的變量名%
例如:
echo %bkup%
如果命令提示符返回的結果是我們剛剛設置的變量值,那就說明我們成功地創建了用戶環境變量。
2、通過命令提示符創建
要通過命令提示符創建用戶環境變量,請按照以下的步驟操作:
點擊“開始”按鈕右側的搜索框/搜索按鈕,或者通過“Win+S”組合鍵喚出Windows Search,搜索并打開“CMD”;
輸入并執行下面這行命令:
setx 要創建的用戶環境變量的變量名“要創建的用戶環境變量的變量值”
例如,我們要創建一個變量名為“bkup”、變量值為“D:\BackUp”的用戶環境變量,那么我們此時需要在命令提示符中輸入和執行的命令則為:
setx bkup "D:\BackUp"
注意:上句命令中的引號為英文引號。
要驗證剛剛的用戶環境變量有沒有創建成功,我們可以關閉并重新打開命令提示符,然后輸入并執行如下命令:
echo %剛剛創建的變量名%
例如:
echo %bkup%
如果命令提示符返回的結果是我們剛剛設置的變量值,那就說明我們成功地創建了用戶環境變量。
擴展:setx命令是一種控制臺命令,它可被用于設置或者取消環境變量。若想了解關于這個命令的詳細用法,請在命令提示符中輸入并執行這行命令:
setx /?
注意:上句命令中的問號為英文問號。
3、通過PowerShell創建
要通過PowerShell創建用戶環境變量,請按照以下的步驟操作:
點擊“開始”按鈕右側的搜索框/搜索按鈕,或者通過“Win+S”組合鍵喚出Windows Search,搜索并打開“PowerShell”;
輸入并執行下面這行命令:
[Environment]::SetEnvironmentVariable("要創建的用戶環境變量的變量名", "要創建的用戶環境變量的變量值" ,"User")
正如上一小節中的例子,若我們要創建一個變量名為“bkup”、變量值為“D:\BackUp”的用戶環境變量,那么我們此時需要在PowerShell中輸入和執行的命令則為:
[Environment]::SetEnvironmentVariable("bkup", "D:\BackUp" ,"User")
注意:上句命令中的引號為英文引號。
二、創建系統環境變量
1、通過圖形界面創建
要創建系統環境變量,請通過組合鍵“Win+R”喚出“運行”窗口,然后在輸入框中輸入并運行:
SystemPropertiesAdvanced.exe
我們將看到這一窗口:
點擊窗口右下角的“環境變量”按鈕,將有一個新的窗口彈出如下:
點擊窗口下段的“新建”按鈕,此時將彈出一個“新建系統變量”窗口如下:
輸入要創建的變量名以及要分配給它的變量值。如果我們不想手動輸入,那么我們也可以通過通過點擊窗口左下方的兩個按鈕來瀏覽目錄或者瀏覽文件。
系統環境變量的變量名和變量值設置完成后,請點擊“新建系統變量”右下角的“確定”按鈕來完成創建。
2、通過命令提示符創建
要通過命令提示符創建系統環境變量,請按照以下的步驟操作:
點擊“開始”按鈕右側的搜索框/搜索按鈕,或者通過“Win+S”組合鍵喚出Windows Search,搜索并以管理員身份運行“CMD”;
輸入并執行下面這行命令:
setx /M 要創建的系統環境變量的變量名“要創建的系統環境變量的變量值”
例如,我們要創建一個變量名為“bkup”、變量值為“D:\BackUp”的系統環境變量,那么我們此時需要在命令提示符中輸入和執行的命令則為:
setx /M bkup "D:\BackUp"
注意:上句命令中的引號為英文引號。
3、通過PowerShell創建
要通過PowerShell創建系統環境變量,請按照以下的步驟操作:
點擊“開始”按鈕右側的搜索框/搜索按鈕,或者通過“Win+S”組合鍵喚出Windows Search,搜索并以管理員身份運行“PowerShell”;
輸入并執行下面這行命令:
[Environment]::SetEnvironmentVariable("要創建的系統環境變量的變量名", "要創建的系統環境變量的變量值" ,"Machine")
例如,如果我們要創建一個變量名為“bkup”、變量值為“D:\BackUp”的系統環境變量,那么我們此時需要在PowerShell中輸入和執行的命令則為:
[Environment]::SetEnvironmentVariable("bkup", "D:\BackUp" ,"Machine")
注意:上句命令中的引號為英文引號。
若要驗證剛剛我們有沒有通過圖形界面、命令提示符或者PowerShell成功地創建系統環境變量,我們可以打開命令提示符,然后輸入并執行如下命令:
echo %剛剛創建的變量名%
例如:
echo %bkup%
如果命令提示符返回的結果是我們剛剛設置的變量值,那就說明我們成功地創建了系統環境變量。
三、總結
在今天的這期教程中,我們討論了通過圖形界面、命令提示符和創建用戶環境變量和系統環境變量的方法。這些方法做上去就像它們看上去一樣簡單。想要了解更多關于Windows的使用技巧,請繼續關注IT之家學院。