#!/bin/bash
-# Usages:
-# dotnet-build.sh build [Target] [Configuration]
-# dotnet-build.sh pack [NuSpec] [Version]
-
usage() {
- echo "Usage:"
- echo " $0 restore TARGET"
- echo " - TARGET : Project Directory, Solution File(.sln), Project JSON(.project.json)"
- echo " $0 build TARGET CONFIGURATION"
- echo " - TARGET : Project Directory, Solution File(.sln), Project File(.csproj)"
- echo " - CONFIGURATION : Configuration name defined in .csproj (Debug, Release)"
- echo " $0 pack NUSPEC VERSION CONFIGURATION"
- echo " - NUSPEC : .nuspec file path"
- echo " - VERSION : Version of nuget package to be created"
- echo " - CONFIGURATION : Configuration name defined in .csproj (Debug, Release)"
+ echo "usage: "
+ echo " $0 restore <project> [-s <source>] ..."
+ echo " $0 build <project> [-c <configuration>] ..."
+ echo " $0 pack <project> [-c <configuration>] [-v <version>] ..."
+ echo " $0 install <project> [-t <type>]"
}
exit_on_error() {
fi
}
-nuget_retry() {
- local RETRY=3
+retry() {
+ local CMD=$1; shift
+ local RETRY=$1; shift
local RET=0
local n=0
until [ $n -ge $RETRY ]; do
sleep 2
echo "Retry $n ....."
fi
- echo "+ nuget $@"
- nuget $@
+ echo "+ $CMD $@"
+ $CMD $@
RET=$?
if [ $RET -eq 0 ]; then
break
exit_on_error $RET
}
-cs_build() {
+run_nuget() {
+ retry nuget 3 $@
+}
+
+run_xbuild() {
echo "+ xbuild $@"
xbuild $@
exit_on_error $?
}
-restore() {
- local TARGET=$1; shift
-
- if [ -d $TARGET ]; then
- local PROJFILES=$(find $TARGET -name "*.project.json")
- for P in $PROJFILES; do
- nuget_retry restore $P $@
- done
- elif [ -f $TARGET ]; then
- nuget_retry restore $TARGET $@
- else
- echo "Invalid nuget restore target."
- exit 1
- fi
-}
-
-build_solution() {
- local TARGET=$1; shift
- local CONFIGURATION=$1; shift
-
- cs_build $TARGET /p:Configuration=$CONFIGURATION $@
+run_dotnet() {
+ echo "+ dotnet $@"
+ dotnet $@
+ exit_on_error $?
}
build_project() {
- local TARGET=$1; shift
- local CONFIGURATION=$1; shift
+ local CSPROJ=$1; shift
- local PROJECT=${TARGET%.*}
- local PROJECT_JSON=$PROJECT.project.json
+ local PROJNAME=${CSPROJ%.*}
+ local PROJECT_JSON=$PROJNAME.project.json
if [ -f $PROJECT_JSON ]; then
- restore $PROJECT_JSON
+ run_nuget restore $PROJECT_JSON
+ fi
+ run_xbuild $CSPROJ /p:Configuration=$CONFIGURATION $@
+}
+
+cmd_restore() {
+ if $USE_DOTNET_CLI; then
+ local OPTS=""
+ [ -n "$SOURCE" ] && OPTS="$OPTS -s $SOURCE"
+ run_dotnet restore $PROJECT $OPTS $@
+ else
+ if [[ $PROJECT_TYPE == "dir" ]]; then
+ local PROJFILES=$(find $PROJECT -name "*.project.json")
+ for p in $PROJFILES; do
+ run_nuget restore $p $@
+ done
+ else
+ run_nuget restore $PROJECT $@
+ fi
fi
- cs_build $TARGET /p:Configuration=$CONFIGURATION $@
}
-build() {
- local TARGET=$1; shift
- local CONFIGURATION=$1; shift
+cmd_build() {
+ if $USE_DOTNET_CLI; then
+ cmd_restore # restore first
+ local OPTS=""
+ [ -n "$CONFIGURATION" ] && OPTS="$OPTS -c $CONFIGURATION"
+ [ -n "$VERSION" ] && OPTS="$OPTS /p:Version=$VERSION"
+ run_dotnet build $PROJECT $OPTS $@
+ else
+ if [[ $PROJECT_TYPE == "dir" ]]; then
+ local PROJFILES=$(find $PROJECT -name "*.csproj")
+ for p in $PROJFILES; do
+ build_project $p $@
+ done
+ elif [[ $PROJECT_TYPE == "sln" ]]; then
+ run_xbuild $PROJECT /p:Configuration=$CONFIGURATION $@
+ elif [[ $PROJECT_TYPE == "csproj" ]]; then
+ build_project $PROJECT $@
+ fi
+ fi
+}
- if [[ $TARGET == *".sln" ]]; then
- build_solution $TARGET $CONFIGURATION $@
- elif [[ $TARGET == *".csproj" ]]; then
- build_project $TARGET $CONFIGURATION $@
+cmd_pack() {
+ if $USE_DOTNET_CLI; then
+ local OPTS=""
+ [ -n "$CONFIGURATION" ] && OPTS="$OPTS -c $CONFIGURATION"
+ [ -n "$VERSION" ] && OPTS="$OPTS /p:Version=$VERSION"
+ run_dotnet pack $PROJECT $OPTS $@
else
- local PROJFILES=$(find $TARGET -name "*.csproj")
- for P in $PROJFILES; do
- build_project $P $CONFIGURATION $@
+ local NUSPEC=($PROJECT)
+ if [ -d $PROJECT ]; then
+ NUSPEC=($(find $PROJECT -name "*.nuspec"))
+ fi
+ for x in ${NUSPEC[@]}; do
+ run_nuget pack $x -Version $VERSION -Properties Configuration=$CONFIGURATION $@
done
fi
}
-pack() {
- local NUSPEC=$1; shift
- local VERSION=$1; shift
- local CONFIGURATION=$1; shift
+cmd_install() {
+ local DEST=$1; shift
+
+ mkdir -p $DEST
- if [ -f $NUSPEC ]; then
- nuget_retry pack $NUSPEC -Version $VERSION -Properties Configuration=$CONFIGURATION $@
+ if [[ $TYPE == "assembly" ]]; then
+ find $PROJECT/bin -name $PROJECT.dll -exec install -p -m 644 {} $DEST \;
+ elif [[ $TYPE == "nupkg" ]]; then
+ find . -name "$PROJECT.[0-9]*.nupkg" -exec install -p -m 644 {} $DEST \;
fi
}
+#########################################################################
+
+# Parse arguments
+
+while getopts "s:c:v:t:" o; do
+ case "$o" in
+ s) SOURCE=${OPTARG} ;;
+ c) CONFIGURATION=${OPTARG} ;;
+ v) VERSION=${OPTARG} ;;
+ t) TYPE=${OPTARG} ;;
+ *) usage; exit 1 ;;
+ esac
+done
+shift $((OPTIND-1))
+
+if [ $# -lt 2 ]; then
+ usage; exit 1
+fi
+
CMD=$1; shift
-case $CMD in
- restore)
- if [ $# -ge 1 ]; then
- restore $@
- exit 0
- fi
- ;;
- build)
- if [ $# -ge 2 ]; then
- build $@
- exit 0
+PROJECT=$1; shift
+
+# Check whether the project can be built using dotnet-cli
+PROJECT_TYPE=""
+USE_DOTNET_CLI=false
+if [ -f $PROJECT ]; then
+ if [[ $PROJECT == *".sln" ]]; then
+ PROJECT_TYPE="sln"
+ VS_VERSION=$(grep -E "^VisualStudioVersion" $PROJECT | cut -f2 -d= | xargs)
+ if [[ $VS_VERSION == "15."* ]]; then
+ USE_DOTNET_CLI=true
fi
- ;;
- pack)
- if [ $# -ge 3 ]; then
- pack $@
- exit 0
+ elif [[ $PROJECT == *".csproj" ]]; then
+ PROJECT_TYPE="csproj"
+ RET=$(grep "Microsoft.NET.Sdk" $PROJECT | wc -l)
+ if [ $RET -gt 0 ]; then
+ USE_DOTNET_CLI=true
fi
- ;;
-esac
+ elif [[ $PROJECT == *".project.json" ]]; then
+ PROJECT_TYPE="project.json"
+ fi
+elif [ -d $PROJECT ]; then
+ PROJECT_TYPE="dir"
+ RET=$(find $PROJECT -name "*.project.json" | wc -l)
+ if [ $RET -eq 0 ]; then
+ CSPROJS=$(find $PROJECT -name "*.csproj")
+ for p in $CSPROJS; do
+ RET=$(grep "Microsoft.NET.Sdk" $p | wc -l)
+ if [ $RET -gt 0 ]; then
+ USE_DOTNET_CLI=true
+ break;
+ fi
+ done
+ fi
+fi
+
+# Disable telemetry of dotnet
+export DOTNET_CLI_TELEMETRY_OPTOUT=1
+
+# To build PCL projects ReferenceAssemblyRoot should be set.
+# dotnet-cli will find reference assemblies for PCL in this path.
+export ReferenceAssemblyRoot=/usr/lib/mono/xbuild-frameworks
+
+# Dump
+echo "----------------------------------------------"
+echo "CMD=$CMD"
+echo "PROJECT=$PROJECT"
+echo "PROJECT_TYPE=$PROJECT_TYPE"
+echo "USE_DOTNET_CLI=$USE_DOTNET_CLI"
+echo "SOURCE=$SOURCE"
+echo "CONFIGURATION=$CONFIGURATION"
+echo "VERSION=$VERSION"
+echo "TYPE=$TYPE"
+echo "REST ARGS=$@"
+echo "----------------------------------------------"
-usage; exit 1
+case $CMD in
+ restore) cmd_restore $@ ;;
+ build) cmd_build $@ ;;
+ pack) cmd_pack $@ ;;
+ install) cmd_install $@ ;;
+ *) usage; exit 1 ;;
+esac