@name 创建新的项目 @author hwliang<2021-08-09> @param get { project_name: string<项目名称> project_cwd: string<项目目录> project_script: string<项目脚本> project_ps: string<项目备注信息> bind_extran
(self,get)
| 542 | |
| 543 | |
| 544 | def create_project(self,get): |
| 545 | ''' |
| 546 | @name 创建新的项目 |
| 547 | @author hwliang<2021-08-09> |
| 548 | @param get<dict_obj>{ |
| 549 | project_name: string<项目名称> |
| 550 | project_cwd: string<项目目录> |
| 551 | project_script: string<项目脚本> |
| 552 | project_ps: string<项目备注信息> |
| 553 | bind_extranet: int<是否绑定外网> 1:是 0:否 |
| 554 | domains: list<域名列表> ["domain1:80","domain2:80"] // 在bind_extranet=1时,需要填写 |
| 555 | is_power_on: int<是否开机启动> 1:是 0:否 |
| 556 | run_user: string<运行用户> |
| 557 | max_memory_limit: int<最大内存限制> // 超出此值项目将被强制重启 |
| 558 | nodejs_version: string<nodejs版本> |
| 559 | pkg_manager:string["npm", "pnpm", "yarn"], 选择包管理工具 |
| 560 | } |
| 561 | @return dict |
| 562 | ''' |
| 563 | if not isinstance(get,public.dict_obj): return public.return_error('参数类型错误,需要dict_obj对像') |
| 564 | if not self.is_install_nodejs(get): |
| 565 | return public.return_error('请先安装nodejs版本管理器,并安装至少1个node.js版本') |
| 566 | if not 'project_script' in get: |
| 567 | return public.return_error("请选择【启动选项】") |
| 568 | |
| 569 | project_name = get.project_name.strip() |
| 570 | if not re.match("^\w+$",project_name): |
| 571 | return public.return_error('项目名称格式不正确,支持字母、数字、下划线,表达式: ^[0-9A-Za-z_]$') |
| 572 | |
| 573 | if public.M('sites').where('name=?',(get.project_name,)).count(): |
| 574 | return public.return_error('指定项目名称已存在: {}'.format(get.project_name)) |
| 575 | get.project_cwd = get.project_cwd.strip() |
| 576 | if get.project_cwd[-1] == '/': |
| 577 | get.project_cwd = get.project_cwd[:-1] |
| 578 | if not os.path.exists(get.project_cwd): |
| 579 | return public.return_error('项目目录不存在: {}'.format(get.project_cwd)) |
| 580 | |
| 581 | # 端口占用检测 |
| 582 | if self.check_port_is_used(get.get('port/port')): |
| 583 | return public.return_error('指定端口已被其它应用占用,请修改您的项目配置使用其它端口, 端口: {}'.format(get.port)) |
| 584 | |
| 585 | domains = [] |
| 586 | if get.bind_extranet == 1: |
| 587 | domains = get.domains |
| 588 | if not public.is_apache_nginx(): return public.return_error('需要安装Nginx或Apache才能使用外网映射功能') |
| 589 | for domain in domains: |
| 590 | if "[" in domain and "]" in domain: # IPv6格式特殊处理 |
| 591 | if "]:" in domain: |
| 592 | domain_arr = domain.rsplit(":", 1) |
| 593 | else: |
| 594 | domain_arr = [domain] |
| 595 | else: |
| 596 | domain_arr = domain.split(':') |
| 597 | if public.M('domain').where('name=?',domain_arr[0]).count(): |
| 598 | return public.return_error('指定域名已存在: {}'.format(domain)) |
| 599 | if "pkg_manager" not in get or get.pkg_manager not in ("npm", "pnpm", "yarn"): |
| 600 | return public.return_error('可选的包管理器为: 【npm, pnpm, yarn】') |
| 601 | else: |
nothing calls this directly
no test coverage detected