Windows 子系统环境开发

Windows-Subsystem-Linux

Posted by HaoDu on May 10, 2020

起因

由于项目使用的 PHP 扩展的特殊性(第三方扩展,只有github 源码,只能源码安装,包括swoole 和其他一些),只能在类unix环境下编译安装运行,办公 PC 又是 windows,所以决定使用 windows子系统

经过

windows 子系统

(前提是windows10 必须是最新版,具体版本如下)

若要查看你的电脑上安装了哪个版本的 Windows 10,请执行以下操作: 选择“开始”按钮 ,然后选择“设置”。 在“设置”中,依次选择“系统”>“关于”。

field value
版本 windows10专业版
版本号 2004
操作系统版本 19041.207

windows 应用商店搜索,linux 只有 debian 系列,下了个 debian;

安装完了之后,需要升级到子系统 2 版本,就可以正常启用子系统了 https://blog.csdn.net/WPwalter/article/details/101508601

安装 LNMP 环境

开始我准备按照之前的 centos 下已有的经验,一个一个来安装

1
2
3
yum install php7.4

yum: command not found

yum 命令不存在 网上查到的解决方案

到上面这个网站去下载如下RPM包 python-iniparse-0.3.1-2.1.el6.noarch.rpm yum-metadata-parser-1.1.2-14.1.el6.x86_64.rpm yum-3.2.29-69.el6.centos.noarch.rpm yum-plugin-fastestmirror-1.1.30-30.el6.noarch.rpm 下载完成之后,用rpm命令进行安装,如下: rpm -ivh –force –nodeps python-iniparse-0.3.1-2.1.el6.noarch.rpm rpm -ivh –force –nodeps yum-metadata-parser-1.1.2-14.1.el6.x86_64.rpm rpm -ivh –force –nodeps yum-3.2.29-69.el6.centos.noarch.rpm yum-plugin-fa

rpm命令也不存在,陷入死循环。。。

,后来看到大家用 wget,结果wget 命令也不存在,wget 是个软件,需要安装。。。 而用来安装的yum 也不存在。。。。。。。。。死循环+1

后来知道 debian 一般用 apt ,同 centos 下yum (apt-get 是旧版本)

1
apt install wget

报错

1
Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission

网上找教程是让删除 lock 文件,不管用; win cmd 下执行

1
Debian config --default-user root

(给了root权限后,后来又出现数字不一样 好像是10 或者11,再删,管用了) 用了之后

apt updateapt upgrade 结果跑了好久,看执行过程,应该是卡在更新debian相关的内容上了 切换linux 源, 修改这个文件,先备份下,然后修改里边的url 为国内域名就好了 一般改163的网易

1
 mv /etc/apt/sources.list /etc/apt/sources.list.bak

然后重新执行,跑动了

1
 apt install wget

安装好 wget 就可以进行下一步了

过程中 我想用命令行看下php扩展 php -m 添加php到环境变量怎么搞,忘了

windows下设置PHP环境变量
1.找到“高级系统设置”(二选一的方法找到环境变量)
① 我的电脑-属性-高级-环境变量
②win8,10 直接在搜索框搜 “查看高级系统设置”-环境变量
2.找到变量”Path” (win10用②)
①在原来的后边加上“;D:/xammp/php” (php.exe所在的目录,前边还有个;)
②或者是按新建加上 “D:/xammp/php”
3.重新打开cmd
win+R,输入 php -m

安装 LNMP 一键包

lnmp.org 因为项目用的是PHP7.4 ,只有最新的lnmp 1.7才有,所以我们要安装最新的1.7版本

1
2
screen -S lnmp
wget http://soft.vpser.net/lnmp/lnmp1.7beta.tar.gz -cO lnmp1.7beta.tar.gz && tar zxf lnmp1.7beta.tar.gz && cd lnmp1.7 && ./install.sh lnmp 

请注意最后面的lnmp参数,如需要lnmpa 或 lamp 模式,请替换lnmp为你要安装的模式。

子系统自动重启 LNMP

因为子系统每次关机都会被关闭,内部不能使用自启 LNMP 环境,我们可以利用 vbs 和 shell 脚本来实现

新建一个vbs,win 会在命令行中运行

Set ws = WScript.CreateObject("WScript.Shell")        
ws.run "wsl -d Debian -u root /etc/init.wsl"# 你要执行的shell jiaoben

关闭子系统

1
2
Set ws = WScript.CreateObject("WScript.Shell")        
ws.run "wsl --shutdown"

shell 脚本

1
2
3
4
5
6
7
#! /bin/sh
#/etc/init.d/ssh start
/etc/init.d/mysql start
#/etc/init.d/php-fpm start
/etc/init.d/php-fpm7.3 start
/etc/init.d/nginx start
/etc/init.d/redis  start

将vbs 放到开机自启中

win + r 输入 shell:startup 将需要自启的文件放入即可

1
2
3
4
5
6
7
#! /bin/sh
#/etc/init.d/ssh start
/etc/init.d/mysql start
#/etc/init.d/php-fpm start
/etc/init.d/php-fpm7.3 start
/etc/init.d/nginx start
/etc/init.d/redis  start

运行项目

子系统和win 上端口会冲突,子系统优先(我遇到的情况是这样的,other说他遇到的是win 优先)

子系统文件无法通过 windows 图形化界面修改文件,提示权限问题(使用root 用户后,重启电脑即可)

电脑重启后,子系统相关软件不能自启动,需要手动(也可写脚本,放到win 自启中)

hosts 文件需要修改win 上的,–我陷入误区,改了子系统中的–;

终于看到报错了,缺少组件 composer update(win下的话 也要加环境变量哦)

composer 也卡,源切到淘宝

1
$ composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

composer install 不要 update 除非修改了依赖关系,否则应该使用 composer install

所有的依赖都定义在composer.json中,手册中给出了一些基本用法和例子。你可能已经注意到,在指定版本号的时候,我们并不一定要指明一个精确的版本。那么就有可能发生这么一个情况,对于同一份composer.json,我们在不同时刻拉取到的依赖文件可能不同(因为composer会在满足条件的情况下去拉取最新的那份依赖),从而导致一些异常情况。composer update和composer install正是为了解决这个问题而出现的。

当你执行composer update的时候,composer会去读取composer.json中指定的依赖,去分析他们,并且去拉取符合条件最新版本的依赖。然后他会把所拉取到的依赖放入vendor目录下,并且把所有拉取的依赖的精确版本号写入composer.lock文件中。

composer install所执行的事情非常类似,只在第一步的时候有差别。当你本地如果已经存在一份composer.lock时,它将会去读取你的composer.lock而非composer.json,并且以此为标准去下载依赖。当你本地没有composer.lock的时候,它所做的事情和composer update其实并没有区别。

这意味着,只要你本地有一份composer.lock,你就可以保证无论过去了多久,你都能拉到相同的依赖。而如果你把它纳入你的项目的版本控制中,那么你就可以确保你项目中的每一个人、每一台电脑,不管什么系统,都能拉取到一模一样的依赖,以减少潜在的依赖对部署的影响。当然,请记得,你应该使用的命令是composer install。

那什么时候该使用composer update呢?当你修改了你的依赖关系,不管是新增了依赖,还是修改了依赖的版本,又或者是删除了依赖,这时候如果你执行composer install的时候,是不会有任何变更的,但你会得到一个警告信息

继续报错,.env 文件不存在以及空格问题

跑路由后401,伪静态问题

laraval伪静态

1
2
3
4
5
#try_files $uri $uri/ @rewrite; 
try_files $uri $uri/ /index.php?$query_string;

rewrite ^/(.*)$ /index.php?_url=/$1;

根据项目需求不同的php版本,在 nginx 配置文件中, include 不一样的php版本(php-fpm)

安装 node.js 和 npm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  
   78  wget https://nodejs.org/dist/v12.16.3/node-v12.16.3-linux-x64.tar.xz
   79  tar -xvf node-v12.16.3-linux-x64.tar.xz
   81  cd node-v12.16.3-linux-x64
   170  ln -s /home/node-v12.16.3-linux-x64/bin/npm /usr/local/bin/#软链
   83  cd bin/;
   88  node -v
   89  cd /home/wwwroot/your-project
   94  npm config set registry https://registry.npm.taobao.org#淘宝镜像
   172  npm install -g cnpm --registry=https://registry.npm.taobao.org

   97  cnpm i
   98  npm -v
   99  node -v
  124   npm install --save @/components/common/footBar#这个是 npm 提示,其实不应该安装,这是文件名写错,他当做一个依赖了,我开始是直接按照提示进行了错误操作
  132  rm -rf ./node_modules#删除重新安装
  133  npm cache clear -f#清空缓存
  140  cnpm i
  141  cnpm run  dev

npm run dev 的时候,一直遇到这个问题

1
2
3
4
5
6
7
8
9
This dependency was not found:

* @/components/common/footBar in ./src/router/index.js

To install it, you can run: npm install --save @/components/common/footBar


These relative modules were not found:

网上搜索,发现可能是把文件当作依赖包来处理了 最后发现是 没有 footBar 这个文件, 只有footbar…将文件改为大写,完美运行

1
2
3
 DONE  Compiled successfully in 3304ms                                                                                                                                                                                             9:47:46 AM

 I  Your application is running here: http://0.0.0.0:8066

这一刻还是有点爽的,经历了两天的挫败,终于自己解决了个小问题