246 lines
8.4 KiB
Bash
246 lines
8.4 KiB
Bash
|
#!/usr/bin/env bash
|
||
|
|
||
|
#############################################################
|
||
|
# Author: Taryel Hlontsi, 2024
|
||
|
# This program is free software: you can redistribute it and/or modify
|
||
|
# it under the terms of the GNU General Public License as published by
|
||
|
# the Free Software Foundation, either version 3 of the License, or
|
||
|
# (at your option) any later version.
|
||
|
#
|
||
|
# This program is distributed in the hope that it will be useful,
|
||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
# GNU General Public License for more details.
|
||
|
#
|
||
|
# You should have received a copy of the GNU General Public License
|
||
|
# along with this program. If not, see <https://www.gnu.org/licenses/>
|
||
|
#############################################################
|
||
|
|
||
|
doc=$(cat <<'EOF'
|
||
|
NOTES:
|
||
|
1) In fact, Emacs has a built-in feature to autoinstall LSP (OmniSharp or csharp_ls) and DAP (netcoredbg)
|
||
|
2) Different versions of .NET can be extracted to the same directory, which coexist side-by-side
|
||
|
3) If something else than $HOME/.dontet is specified, you would need to install the dotnet tools with --tool-path option
|
||
|
4) OmniSharp is a golden standard but it may not work with the latest dotnet SDK, in this case prefer csharp-ls
|
||
|
5) For debugging a debug profile is needed, example:
|
||
|
(dap-register-debug-template
|
||
|
"NetCoreDbg::Launch"
|
||
|
(list :type "coreclr"
|
||
|
:request "launch"
|
||
|
:program "/home/zed/Documents/dotnet-console-games/Projects/2048/bin/Debug/2048.dll"
|
||
|
:cwd "/home/zed/Documents/dotnet-console-games/Projects/2048/"
|
||
|
:mode "launch"
|
||
|
:name "NetCoreDbg::Launch"
|
||
|
:dap-compilation "dotnet build"))
|
||
|
Then evaluate this snippet, M+x dap-debug and finally select that profile
|
||
|
6) Debugger can also be run as a console app, example:
|
||
|
netcoredbg --interpreter=cli -- dotnet 2048.dll
|
||
|
In this case, for priting out the code lines in console, this has to be included in csproj:
|
||
|
<EmbedAllSources>true</EmbedAllSources>
|
||
|
Docs are there: https://github.com/Samsung/netcoredbg/blob/master/docs/cli.md
|
||
|
7) To start a PowerShell session just type: pwsh
|
||
|
EOF
|
||
|
)
|
||
|
|
||
|
#############################################################
|
||
|
# SETUP SECTION, do NOT use "sudo" or "./" to run the script. Source it!
|
||
|
#############################################################
|
||
|
LINK_SDK6="https://download.visualstudio.microsoft.com/download/pr/19144d78-6f95-4810-a9f6-3bf86035a244/23f4654fc5352e049b517937f94be839/dotnet-sdk-6.0.421-linux-x64.tar.gz"
|
||
|
LINK_SDK8="https://download.visualstudio.microsoft.com/download/pr/0a1b3cbd-b4af-4d0d-9ed7-0054f0e200b4/4bcc533c66379caaa91770236667aacb/dotnet-sdk-8.0.204-linux-x64.tar.gz"
|
||
|
LINK_OMNI="https://github.com/OmniSharp/omnisharp-roslyn/releases/download/v1.39.11/omnisharp-linux-x64-net6.0.tar.gz"
|
||
|
LINK_DEBUGGER="https://github.com/Samsung/netcoredbg/releases/download/3.1.0-1031/netcoredbg-linux-amd64.tar.gz"
|
||
|
INSTALL_DIR=$HOME/.dotnet
|
||
|
LOG_DIR="${INSTALL_DIR}/logs"
|
||
|
LOG="${LOG_DIR}/log.txt"
|
||
|
BASHRC="$HOME/.bashrc"
|
||
|
|
||
|
#############################################################
|
||
|
# HELPER FUNCTIONS
|
||
|
#############################################################
|
||
|
info() {
|
||
|
GREEN='\033[1;32m'
|
||
|
NC='\033[0m'
|
||
|
echo -e "${GREEN}$1${NC}"
|
||
|
echo -e "INFO:\t$1" >> $LOG
|
||
|
}
|
||
|
|
||
|
trace() {
|
||
|
YELLOW='\033[1;33m'
|
||
|
NC='\033[0m'
|
||
|
echo -e "${YELLOW}$1${NC}"
|
||
|
echo -e "TRACE:\t$1" >> $LOG
|
||
|
}
|
||
|
|
||
|
warn() {
|
||
|
PURPLE='\033[1;35m'
|
||
|
NC='\033[0m'
|
||
|
echo -e "${PURPLE}$1${NC}"
|
||
|
echo -e "WARN:\t$1" >> $LOG
|
||
|
}
|
||
|
|
||
|
error() {
|
||
|
RED='\033[1;31m'
|
||
|
NC='\033[0m'
|
||
|
echo -e "${RED}$1${NC}"
|
||
|
echo -e "ERROR:\t$1" >> $LOG
|
||
|
}
|
||
|
|
||
|
#############################################################
|
||
|
# 1 - DOWNLOAD SDK
|
||
|
#############################################################
|
||
|
download_sdk() {
|
||
|
local step_name='STEP 1 Downloading the SDK'
|
||
|
warn "Press enter to proceed with $step_name"; read
|
||
|
info "$step_name"
|
||
|
|
||
|
if [[ -z "$1" ]]; then
|
||
|
error "The URL link to SDK archive is expected as argument for this function!"
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
local link="$1"
|
||
|
local archive=$INSTALL_DIR/dotnet.tar.gz
|
||
|
|
||
|
export DOTNET_CLI_TELEMETRY_OPTOUT=1
|
||
|
|
||
|
wget --continue $link --output-document $archive && \
|
||
|
tar zxf $archive -C $INSTALL_DIR && \
|
||
|
rm $archive
|
||
|
|
||
|
[[ $? -gt 0 ]] && { error "$step_name failed, stopping now"; return 1; }
|
||
|
|
||
|
info "done"
|
||
|
}
|
||
|
|
||
|
#############################################################
|
||
|
# 2 - SET UP BASH PROFILE
|
||
|
#############################################################
|
||
|
setup_bash_profile() {
|
||
|
local step_name='STEP 2 Setup bash profile'
|
||
|
warn "Press enter to proceed with $step_name"; read
|
||
|
info "$step_name"
|
||
|
|
||
|
echo :$PATH: | grep -q -E ":$HOME/.local/bin:" || echo 'export PATH=$PATH:$HOME/.local/bin' >> $BASHRC && \
|
||
|
sed -i '/export DOTNET_ROOT=\$HOME\/.dotnet/d' $BASHRC > /dev/null 2>&1 && \
|
||
|
sed -i '/export PATH=\$PATH:\$HOME\/.dotnet/d' $BASHRC > /dev/null 2>&1 && \
|
||
|
sed -i '/export DOTNET_CLI_TELEMETRY_OPTOUT=1/d' $BASHRC > /dev/null 2>&1 && \
|
||
|
echo 'export DOTNET_ROOT=$HOME/.dotnet' >> $BASHRC && \
|
||
|
echo 'export PATH=$PATH:$HOME/.dotnet:$HOME/.dotnet/tools' >> $BASHRC && \
|
||
|
echo 'export DOTNET_CLI_TELEMETRY_OPTOUT=1' >> $BASHRC
|
||
|
|
||
|
[[ $? -gt 0 ]] && { error "$step_name failed, stopping now"; return 1; }
|
||
|
|
||
|
source "$BASHRC"
|
||
|
|
||
|
info "done"
|
||
|
}
|
||
|
|
||
|
#############################################################
|
||
|
# 3 - INSTALL POWERSHELL
|
||
|
#############################################################
|
||
|
install_powershell() {
|
||
|
local step_name='STEP 3 Installing powershell'
|
||
|
warn "Press enter to proceed with $step_name"; read
|
||
|
info "$step_name"
|
||
|
|
||
|
dotnet tool install --global PowerShell
|
||
|
|
||
|
[[ $? -gt 0 ]] && { error "$step_name failed, stopping now"; return 1; }
|
||
|
|
||
|
info "done"
|
||
|
}
|
||
|
|
||
|
#############################################################
|
||
|
# 4 - DOWNLOAD NETCOREDBG
|
||
|
#############################################################
|
||
|
download_netcoredbg() {
|
||
|
local step_name='STEP 4 Downloading netcoredbg'
|
||
|
warn "Press enter to proceed with $step_name"; read
|
||
|
info "$step_name"
|
||
|
local archive=$INSTALL_DIR/netcoredbg.tar.gz
|
||
|
local target=$INSTALL_DIR
|
||
|
|
||
|
wget --continue $LINK_DEBUGGER --output-document $archive && \
|
||
|
mkdir -p $target && \
|
||
|
tar zxf $archive -C $target && \
|
||
|
rm $archive && \
|
||
|
mkdir -p $HOME/.local/bin && \
|
||
|
ln -s $target/netcoredbg/netcoredbg $HOME/.local/bin/netcoredbg
|
||
|
|
||
|
[[ $? -gt 0 ]] && { error "$step_name failed, stopping now"; return 1; }
|
||
|
|
||
|
info "done"
|
||
|
}
|
||
|
|
||
|
#############################################################
|
||
|
# 5 - DOWNLOAD OMNISHARP
|
||
|
#############################################################
|
||
|
download_omnisharp() {
|
||
|
local step_name='STEP 5 Downloading Omnisharp'
|
||
|
warn "Press enter to proceed with $step_name"; read
|
||
|
info "$step_name"
|
||
|
local archive=$INSTALL_DIR/omnisharp.tar.gz
|
||
|
local target=$INSTALL_DIR/omnisharp
|
||
|
|
||
|
wget --continue $LINK_OMNI --output-document $archive && \
|
||
|
mkdir -p $target && \
|
||
|
tar zxf $archive -C $target && \
|
||
|
rm $archive && \
|
||
|
mkdir -p $HOME/.local/bin && \
|
||
|
ln -s $target/OmniSharp $HOME/.local/bin/OmniSharp
|
||
|
|
||
|
[[ $? -gt 0 ]] && { error "$step_name failed, stopping now"; return 1; }
|
||
|
|
||
|
info "done"
|
||
|
}
|
||
|
|
||
|
#############################################################
|
||
|
# 6 - INSTALL CSHARP-LS (OPTIONAL)
|
||
|
#############################################################
|
||
|
install_csharp_ls() {
|
||
|
local step_name='STEP 6 Installing csharp-ls'
|
||
|
warn "Press enter to proceed with $step_name"; read
|
||
|
info "$step_name"
|
||
|
|
||
|
dotnet tool install --global csharp-ls
|
||
|
|
||
|
[[ $? -gt 0 ]] && { error "$step_name failed, stopping now"; return 1; }
|
||
|
|
||
|
info "done"
|
||
|
}
|
||
|
|
||
|
#############################################################
|
||
|
# RUN SECTION
|
||
|
#############################################################
|
||
|
if [ $0 == $BASH_SOURCE ]; then
|
||
|
error "Do not run the script in a subshell via ./ Instead you should 'source' it!"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
user=$(whoami)
|
||
|
if [ $user == root ]; then
|
||
|
error "You should NOT be using a root account"
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
mkdir -p $INSTALL_DIR
|
||
|
mkdir -p $LOG_DIR
|
||
|
|
||
|
echo $(date +'%Y-%m-%d %H:%M') > $LOG
|
||
|
info "$doc"
|
||
|
|
||
|
download_sdk $LINK_SDK6 && \
|
||
|
download_sdk $LINK_SDK8 && \
|
||
|
setup_bash_profile && \
|
||
|
install_powershell && \
|
||
|
download_netcoredbg && \
|
||
|
download_omnisharp && \
|
||
|
#install_csharp_ls && \
|
||
|
|
||
|
dotnet --list-sdks
|
||
|
|
||
|
info "Bye!"
|
||
|
info "PS. Log is here: ${LOG}"
|
||
|
|
||
|
return 0
|