anthony bu gisti düzenledi . Düzenlemeye git
1 file changed, 157 insertions
php(dosya oluşturuldu)
@@ -0,0 +1,157 @@ | |||
1 | + | #!/bin/bash | |
2 | + | ||
3 | + | # Welcome to amusement park! | |
4 | + | ||
5 | + | [[ "$1" = '--help' ]] || [[ "$1" = '-h' ]] && cat <<EOF && exit | |
6 | + | NetBeans docker wrapper for php | |
7 | + | =============================== | |
8 | + | Anthony Axenov (c) 2023, The MIT License | |
9 | + | https://axenov.dev | |
10 | + | https://opensource.org/license/mit | |
11 | + | Replacement host php interpreter with dockerized one to run & debug cli php scripts. | |
12 | + | Usage: | |
13 | + | ./$(basename $0) --container=<NAME> [--map=<PATH1>:<PATH2>] [PHP_ARGS] <SCRIPT> [SCRIPT_ARGS] | |
14 | + | Arguments: | |
15 | + | --container : docker container where your SCRIPT is located. Required. | |
16 | + | --map : sources path mapped from the host to container. Not required. | |
17 | + | PATH1 is an absolute path to php sources directory on the host. | |
18 | + | PATH2 is an absolute path of the same directory inside of container. | |
19 | + | Delimiter ':' is required. If PATH1, PATH2 or delimiter is missed | |
20 | + | or value is empty then error will be thrown. | |
21 | + | PHP_ARGS : arguments you can pass to real php interpreter according to its --help. | |
22 | + | Not required. | |
23 | + | SCRIPT : a path to script file (.php) to be executed in container. Required. | |
24 | + | Note that this file must exist inside or be available from that container. | |
25 | + | SCRIPT_ARGS : arguments to call your script with. They will be passed to script as is. | |
26 | + | Not required. | |
27 | + | Read this article to know how to set this helper as interpreter for NetBeans: | |
28 | + | ru: https://axenov.dev/netbeans-php-docker-xdebug-cli | |
29 | + | en: https://axenov.dev/en/netbeans-php-docker-xdebug-cli-en | |
30 | + | EOF | |
31 | + | ||
32 | + | pwd=$(pwd) # current working directory | |
33 | + | cmdline=($@) # copy currently called command line to array | |
34 | + | collect_php_args=1 # should we collect php args or script ones? | |
35 | + | quiet=0 # should we print some useful data before executing? | |
36 | + | ||
37 | + | # find a path where this wrapper is located | |
38 | + | wrapper_dir="$(dirname $0)" | |
39 | + | ||
40 | + | # find a path where project is probably located | |
41 | + | project_dir="$(dirname $wrapper_dir)" | |
42 | + | ||
43 | + | # here we check if this wrapper is global or local | |
44 | + | # but if it is set as global from nbproject dir of | |
45 | + | # current project then it is not detected as global | |
46 | + | # anyway behavior will be correct | |
47 | + | nbproject="$(basename $wrapper_dir)" | |
48 | + | [ "$nbproject" = 'nbproject' ] && is_global=0 || is_global=1 | |
49 | + | ||
50 | + | # prepare new array to collect php args | |
51 | + | declare -a php_cmd=("docker" "exec") | |
52 | + | ||
53 | + | # and another one for script args | |
54 | + | declare -a script_args=() | |
55 | + | ||
56 | + | # and one more for directory mapping | |
57 | + | declare -a map_arr=() | |
58 | + | ||
59 | + | # iterate over arguments we received from netbeans | |
60 | + | for arg in "${cmdline[@]}"; do | |
61 | + | ||
62 | + | # if this is a container name | |
63 | + | if [ "${arg::11}" = '--container' ]; then | |
64 | + | container="${arg:12}" # save it | |
65 | + | php_cmd+=("$container" 'php') # add php itself | |
66 | + | continue # jump to next iteration | |
67 | + | fi | |
68 | + | ||
69 | + | # if this is a path map | |
70 | + | if [ "${arg::5}" = '--map' ]; then | |
71 | + | map="${arg:6}" # save it | |
72 | + | map_arr=(${map//:/ }) # split it and check if it is correct | |
73 | + | if [ -z "${map_arr[0]}" ] || [ -z "${map_arr[1]}" ]; then | |
74 | + | echo "ERROR: directory map is incorrect!" | |
75 | + | echo "Use $0 --help to get info about how to use this wrapper." | |
76 | + | echo "Exit code 3." | |
77 | + | exit 3 | |
78 | + | fi | |
79 | + | continue # jump to next iteration | |
80 | + | fi | |
81 | + | ||
82 | + | # if this is a container name | |
83 | + | if [ "${arg::7}" = '--quiet' ]; then | |
84 | + | quiet=1 | |
85 | + | continue # jump to next iteration | |
86 | + | fi | |
87 | + | ||
88 | + | # if this is an absolute path to a script file | |
89 | + | if [ -f "$arg" ]; then | |
90 | + | # make its path correct for container | |
91 | + | if [ "$map" ]; then # when paths are mapped | |
92 | + | # remove first part of map from an absolute filepath and append result to second map part | |
93 | + | filepath="${map_arr[1]}${arg##${map_arr[0]}}" | |
94 | + | else # when paths are NOT mapped | |
95 | + | # remove project path from absolute filepath | |
96 | + | filepath="${arg##$project_dir/}" | |
97 | + | fi | |
98 | + | php_cmd+=("$filepath") # append php args with filepath | |
99 | + | collect_php_args=0 # now we need to collect script args | |
100 | + | continue # jump to next iteration | |
101 | + | fi | |
102 | + | ||
103 | + | if [ "$collect_php_args" = 1 ]; then # if we collect php args | |
104 | + | php_cmd+=("$arg") # add current arg to php args as is | |
105 | + | continue # jump to next iteration | |
106 | + | fi | |
107 | + | ||
108 | + | script_args+=("$arg") # otherwise add current arg to script args as is | |
109 | + | done | |
110 | + | ||
111 | + | # docker container name is required so we must halt here if there is no one | |
112 | + | if [ -z "$container" ]; then | |
113 | + | echo "ERROR: no docker container is specified!" >&2 | |
114 | + | echo "Use $0 --help to get info about how to use this wrapper." >&2 | |
115 | + | echo "Exit code 1." >&2 | |
116 | + | exit 1 | |
117 | + | fi | |
118 | + | ||
119 | + | # path to php script is also required so we must halt here too if there is no one | |
120 | + | if [ -z "$filepath" ]; then | |
121 | + | echo "ERROR: no script filepath is specified!" >&2 | |
122 | + | echo "Use $0 --help to get info about how to use this wrapper." >&2 | |
123 | + | echo "Exit code 2." >&2 | |
124 | + | exit 2 | |
125 | + | fi | |
126 | + | ||
127 | + | cmdline="${php_cmd[*]} ${script_args[*]}" # make a command to execute | |
128 | + | ||
129 | + | # print some important data collected above | |
130 | + | if [ "$quiet" = 0 ]; then | |
131 | + | echo "NetBeans docker wrapper for php" | |
132 | + | echo "===============================" | |
133 | + | echo -e "Container name: $container" | |
134 | + | echo -e "Script path: $filepath" | |
135 | + | echo -e "Directory mapping: ${map:-(none)}" | |
136 | + | echo -e "Command line:\n$cmdline\n" | |
137 | + | fi | |
138 | + | ||
139 | + | # some debug output | |
140 | + | # echo "=== some debug output =========" | |
141 | + | # cat <<EOF | column -t | |
142 | + | # is_global $is_global | |
143 | + | # container $container | |
144 | + | # pwd $pwd | |
145 | + | # wrapper_dir $wrapper_dir | |
146 | + | # nbproject $nbproject | |
147 | + | # project_dir $project_dir | |
148 | + | # map $map | |
149 | + | # map_arr[0] ${map_arr[0]} | |
150 | + | # map_arr[1] ${map_arr[1]} | |
151 | + | # filepath $filepath | |
152 | + | # EOF | |
153 | + | # echo "===============================" | |
154 | + | ||
155 | + | $cmdline # execute | |
156 | + | ||
157 | + | # that's folks! |
Daha yeni
Daha eski