Change Version of PackageReference to latest always
[platform/core/dotnet/build-tools.git] / Tools / dotnet-build.sh
1 #!/bin/bash
2
3 usage() {
4   echo "usage: "
5   echo " $0 restore <project> [-s <source>] ..."
6   echo " $0 build <project> [-c <configuration>] ..."
7   echo " $0 pack <project> [-c <configuration>] [-v <version>] ..."
8   echo " $0 install <project> [-t <type>]"
9 }
10
11 exit_on_error() {
12   if [ $1 -ne 0 ]; then
13     echo "Error $1"
14     exit $1
15   fi
16 }
17
18 retry() {
19   local CMD=$1; shift
20   local RETRY=$1; shift
21   local RET=0
22   local n=0
23   until [ $n -ge $RETRY ]; do
24     if [ $n -gt 0 ]; then
25       sleep 2
26       echo "Retry $n ....."
27     fi
28     echo "+ $CMD $@"
29     $CMD $@
30     RET=$?
31     if [ $RET -eq 0 ]; then
32       break
33     fi
34     n=$[$n+1]
35   done
36   exit_on_error $RET
37 }
38
39 run_nuget() {
40   retry nuget 3 $@
41 }
42
43 run_xbuild() {
44   echo "+ xbuild $@"
45   xbuild $@
46   exit_on_error $?
47 }
48
49 run_dotnet() {
50   echo "+ dotnet $@"
51   dotnet $@
52   exit_on_error $?
53 }
54
55 update_version_to_asterisk() {
56   local PROJS=""
57   if [[ $PROJECT_TYPE == "csproj" ]]; then
58     PROJS=$PROJECT
59   elif [[ $PROJECT_TYPE == "dir" ]]; then
60     PROJS=$PROJECT/*.csproj
61   elif [[ $PROJECT_TYPE == "sln" ]]; then
62     PROJS=$(find . -name "*.csproj")
63   fi
64   for p in $PROJS; do
65     xmlstarlet ed -L -u "//PackageReference/@Version" --value "*" $p
66     xmlstarlet ed -L -u "//PackageReference/@version" --value "*" $p
67   done
68 }
69
70 build_project() {
71   local CSPROJ=$1; shift
72
73   local PROJNAME=${CSPROJ%.*}
74   local PROJECT_JSON=$PROJNAME.project.json
75   if [ -f $PROJECT_JSON ]; then
76     run_nuget restore $PROJECT_JSON
77   fi
78   run_xbuild $CSPROJ /p:Configuration=$CONFIGURATION $@
79 }
80
81 cmd_restore() {
82   if $USE_DOTNET_CLI; then
83     update_version_to_asterisk # update PackageReference version to * in .csproj
84     local OPTS=""
85     [ -n "$SOURCE" ] && OPTS="$OPTS -s $SOURCE"
86     run_dotnet restore $PROJECT $OPTS $@
87   else
88     if [[ $PROJECT_TYPE == "dir" ]]; then
89       local PROJFILES=$(find $PROJECT -name "*project.json")
90       for p in $PROJFILES; do
91         run_nuget restore $p $@
92       done
93     else
94       run_nuget restore $PROJECT $@
95     fi
96   fi
97 }
98
99 cmd_build() {
100   if $USE_DOTNET_CLI; then
101     cmd_restore # restore first
102     local OPTS=""
103     [ -n "$CONFIGURATION" ] && OPTS="$OPTS -c $CONFIGURATION"
104     run_dotnet build --no-restore $PROJECT $OPTS $@
105   else
106     if [[ $PROJECT_TYPE == "dir" ]]; then
107       local PROJFILES=$(find $PROJECT -name "*.csproj")
108       for p in $PROJFILES; do
109         build_project $p $@
110       done
111     elif [[ $PROJECT_TYPE == "sln" ]]; then
112       run_xbuild $PROJECT /p:Configuration=$CONFIGURATION $@
113     elif [[ $PROJECT_TYPE == "csproj" ]]; then
114       build_project $PROJECT $@
115     fi
116   fi
117 }
118
119 cmd_pack() {
120   local OPTS=""
121   if $USE_DOTNET_CLI; then
122     [ -n "$CONFIGURATION" ] && OPTS="$OPTS -c $CONFIGURATION"
123     [ -n "$VERSION" ] && OPTS="$OPTS /p:Version=$VERSION"
124     run_dotnet pack --no-restore $PROJECT $OPTS $@
125   else
126     local NUSPEC=($PROJECT)
127     if [ -d $PROJECT ]; then
128       NUSPEC=($(find $PROJECT -name "*.nuspec"))
129     fi
130     [ -n "$CONFIGURATION" ] && OPTS="$OPTS -Properties Configuration=$CONFIGURATION"
131     [ -n "$VERSION" ] && OPTS="$OPTS -Version $VERSION"
132     for x in ${NUSPEC[@]}; do
133       run_nuget pack $x $OPTS $@
134     done
135   fi
136 }
137
138 cmd_install() {
139   local DEST=$1; shift
140
141   mkdir -p $DEST
142
143   if [[ $TYPE == "assembly" ]]; then
144     find $PROJECT/bin -name $PROJECT.dll -exec install -p -m 644 {} $DEST \;
145   elif [[ $TYPE == "nupkg" ]]; then
146     find . -name "$PROJECT.[0-9]*.nupkg" -exec install -p -m 644 {} $DEST \;
147   fi
148 }
149
150 cmd_nuspec_addfile() {
151   local SRC=$1; shift
152   local TARGET=$1; shift
153
154   CHK_FILES=$(xmlstarlet sel -t -v "count(/package/files)" $PROJECT)
155   if [ $CHK_FILES -eq 0 ]; then
156     xmlstarlet ed -L -s "/package" -t elem -n "files" -v "" $PROJECT
157   fi
158
159   xmlstarlet ed -L -s "/package/files" -t elem -n "file" -v "" \
160                 -i "/package/files/file[last()]" -t attr -n "src" -v "$SRC" \
161                 -i "/package/files/file[last()]" -t attr -n "target" -v "$TARGET" \
162                 $PROJECT
163 }
164
165 #########################################################################
166
167 # Parse arguments
168
169 while getopts "s:c:v:t:" o; do
170   case "$o" in
171     s) SOURCE=${OPTARG} ;;
172     c) CONFIGURATION=${OPTARG} ;;
173     v) VERSION=${OPTARG} ;;
174     t) TYPE=${OPTARG} ;;
175     *) usage; exit 1 ;;
176   esac
177 done
178 shift $((OPTIND-1))
179
180 if [ $# -lt 2 ]; then
181   usage; exit 1
182 fi
183
184 CMD=$1; shift
185 PROJECT=$1; shift
186
187 # Check whether the project can be built using dotnet-cli
188 PROJECT_TYPE=""
189 USE_DOTNET_CLI=false
190 if [ -f $PROJECT ]; then
191   if [[ $PROJECT == *".sln" ]]; then
192     PROJECT_TYPE="sln"
193     VS_VERSION=$(grep -E "^VisualStudioVersion" $PROJECT | cut -f2 -d= | xargs)
194     if [[ $VS_VERSION == "15."* ]]; then
195       USE_DOTNET_CLI=true
196     fi
197   elif [[ $PROJECT == *".csproj" ]]; then
198     PROJECT_TYPE="csproj"
199     RET=$(grep "Microsoft.NET.Sdk" $PROJECT | wc -l)
200     if [ $RET -gt 0 ]; then
201       USE_DOTNET_CLI=true
202     fi
203   elif [[ $PROJECT == *".project.json" ]]; then
204     PROJECT_TYPE="project.json"
205   fi
206 elif [ -d $PROJECT ]; then
207   PROJECT_TYPE="dir"
208   RET=$(find $PROJECT -name "*.project.json" | wc -l)
209   if [ $RET -eq 0 ]; then
210     CSPROJS=$(find $PROJECT -name "*.csproj")
211     for p in $CSPROJS; do
212       RET=$(grep "Microsoft.NET.Sdk" $p | wc -l)
213       if [ $RET -gt 0 ]; then
214         USE_DOTNET_CLI=true
215         break;
216       fi
217     done
218   fi
219 fi
220
221 # Disable telemetry of dotnet
222 export DOTNET_CLI_TELEMETRY_OPTOUT=1
223
224 # To build PCL projects ReferenceAssemblyRoot should be set.
225 # dotnet-cli will find reference assemblies for PCL in this path.
226 export ReferenceAssemblyRoot=/usr/lib/mono/xbuild-frameworks
227
228 # Dump
229 echo "----------------------------------------------"
230 echo "CMD=$CMD"
231 echo "PROJECT=$PROJECT"
232 echo "PROJECT_TYPE=$PROJECT_TYPE"
233 echo "USE_DOTNET_CLI=$USE_DOTNET_CLI"
234 echo "SOURCE=$SOURCE"
235 echo "CONFIGURATION=$CONFIGURATION"
236 echo "VERSION=$VERSION"
237 echo "TYPE=$TYPE"
238 echo "REST ARGS=$@"
239 echo "----------------------------------------------"
240
241 case $CMD in
242   restore) cmd_restore $@ ;;
243   build) cmd_build $@ ;;
244   pack) cmd_pack $@ ;;
245   install) cmd_install $@ ;;
246   nuspec_addfile) cmd_nuspec_addfile $@ ;;
247   *) usage; exit 1 ;;
248 esac