Skip to main content

Development Setup

Setting up development environments, IDEs, build tools, and path management on Windows for Linux developers.

Development Environment Philosophy

Windows vs Linux Development Approaches

AspectLinux ApproachWindows ApproachRecommendation
Package managementNative package managersMultiple solutionsUse WSL + native tools
Path structure/usr/bin, /usr/localProgram Files, user pathsLearn both systems
DependenciesSystem-wide packagesPer-project or globalUse virtual environments
Build toolsMake, autotoolsMSBuild, Visual StudioUse cross-platform tools
Environment isolationchroot, containersVMs, containersUse WSL + Docker

Setting Up WSL for Development

WSL Installation and Configuration

# Install WSL 2 with Ubuntu
wsl --install -d Ubuntu

# Update WSL
wsl --update

# Set WSL 2 as default
wsl --set-default-version 2

WSL Development Setup

# Update package lists
sudo apt update && sudo apt upgrade

# Install essential development tools
sudo apt install build-essential git curl wget

# Install additional tools
sudo apt install vim tmux htop tree jq

# Install programming languages
sudo apt install python3 python3-pip nodejs npm

WSL File System Best Practices

# Development work in WSL filesystem (better performance)
mkdir -p ~/dev/projects

# Access Windows files when needed
ls /mnt/c/Users/username/Documents

# Share SSH keys between Windows and WSL
ln -s /mnt/c/Users/username/.ssh ~/.ssh

IDE and Editor Setup

Visual Studio Code

Installation:

# Install via winget
winget install Microsoft.VisualStudioCode

# Or via chocolatey
choco install vscode

Essential Extensions for Linux Developers:

ExtensionPurposeLinux Equivalent
Remote - WSLWSL integrationNative development
Remote - SSHRemote developmentSSH + vim/emacs
DockerContainer supportdocker CLI
GitLensGit integrationgit CLI + gitk
TerminalIntegrated terminalNative terminal

WSL Integration:

# Install VS Code in WSL (installs Windows version with WSL support)
code .

# Open WSL project from Windows
code --remote wsl+Ubuntu ~/dev/project

JetBrains IDEs

IDEPurposeLinux AvailabilityNotes
IntelliJ IDEAJava developmentYesFull cross-platform
PyCharmPython developmentYesProfessional/Community
WebStormWeb developmentYesJavaScript/TypeScript
CLionC/C++ developmentYesCross-platform C++
Rider.NET developmentYesCross-platform .NET

Installation:

# Via JetBrains Toolbox
winget install JetBrains.Toolbox

# Individual IDEs
winget install JetBrains.IntelliJIDEA.Community

Vim/Neovim on Windows

# Install Neovim
winget install Neovim.Neovim

# Or install in WSL
sudo apt install neovim

# Vim for Windows
winget install vim.vim

Text Editors

EditorWindowsLinuxCross-platform
Notepad++NativeWine onlyNo
Sublime TextYesYesYes
AtomYesYesYes (discontinued)
VS CodeYesYesYes

Programming Language Setup

Python Development

Windows Native Python:

# Install Python from Microsoft Store (recommended)
# Or via winget
winget install Python.Python.3.11

# Install pip packages
pip install virtualenv poetry black flake8

Python in WSL:

# Ubuntu comes with Python 3
python3 --version

# Install pip and development tools
sudo apt install python3-pip python3-venv python3-dev

# Create virtual environment
python3 -m venv myproject
source myproject/bin/activate

Python Environment Comparison:

AspectWindows PythonWSL PythonRecommendation
PerformanceGoodBetterUse WSL for CPU-intensive
Package compatibilitySome issuesExcellentUse WSL for Linux packages
GUI applicationsNativeX11 forwardingUse Windows for GUI
System integrationBetterLimitedDepends on use case

Node.js Development

Windows Installation:

# Install Node.js
winget install OpenJS.NodeJS

# Or install LTS version
winget install OpenJS.NodeJS.LTS

# Install global packages
npm install -g yarn pnpm typescript

WSL Installation:

# Install via NodeSource repository
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt-get install -y nodejs

# Or use Node Version Manager (nvm)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
nvm install --lts

Java Development

Windows Installation:

# Install OpenJDK
winget install Microsoft.OpenJDK.11

# Or Oracle JDK
winget install Oracle.JDK.18

# Install Maven
winget install Apache.Maven

# Install Gradle
winget install Gradle.Gradle

WSL Installation:

# Install OpenJDK
sudo apt install openjdk-11-jdk

# Install Maven
sudo apt install maven

# Install Gradle
sudo apt install gradle

Go Development

Windows Installation:

# Install Go
winget install GoLang.Go

# Set GOPATH (optional, Go modules are preferred)
setx GOPATH "%USERPROFILE%\go"

WSL Installation:

# Install Go
sudo apt install golang-go

# Or install latest version manually
wget https://golang.org/dl/go1.20.linux-amd64.tar.gz
sudo tar -xf go1.20.linux-amd64.tar.gz -C /usr/local
export PATH=$PATH:/usr/local/go/bin

Rust Development

Cross-platform Installation:

# Install Rust (same on Windows and Linux)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# Or via winget (Windows)
winget install Rustlang.Rustup

Build Tools and Automation

Make on Windows

# Install Make via chocolatey
choco install make

# Or install via winget (GNU Make)
winget install GnuWin32.Make

# Alternative: Use WSL for Make
wsl make

CMake

# Install CMake
winget install Kitware.CMake

# Use from command line
cmake --version

Docker Development

Docker Desktop Installation:

# Install Docker Desktop
winget install Docker.DockerDesktop

Configuration for WSL 2:

  1. Enable WSL 2 integration in Docker Desktop settings
  2. Enable integration with specific WSL distros
  3. Use Docker from both Windows and WSL

Usage Patterns:

PatternCommand LocationFiles LocationBest For
Windows developmentWindowsWindows.NET, Windows-specific
WSL developmentWSLWSLLinux-focused development
HybridBothWSLCross-platform projects

Git Setup

Windows Git:

# Install Git for Windows
winget install Git.Git

# Configure Git
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"

# Use Windows Credential Manager
git config --global credential.helper manager-core

WSL Git:

# Git is usually pre-installed in WSL
git --version

# Configure Git
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"

# Share credentials with Windows Git
git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/libexec/git-core/git-credential-manager-core.exe"

Path Management

Understanding Windows PATH

# View current PATH
$env:PATH -split ';'

# Add to PATH temporarily
$env:PATH += ";C:\new\path"

# Add to PATH permanently (requires restart)
[Environment]::SetEnvironmentVariable("PATH", $env:PATH + ";C:\new\path", "User")

Environment Variables

VariableWindowsLinuxPurpose
PATH%PATH%$PATHExecutable search paths
HOME%USERPROFILE%$HOMEUser home directory
TEMP%TEMP%/tmpTemporary files

Managing Multiple Versions

Node.js Version Management:

# Windows: nvm-windows
winget install CoreyButler.NVMforWindows

# Usage
nvm install 18.0.0
nvm use 18.0.0

Python Version Management:

# Windows: pyenv-win
git clone https://github.com/pyenv-win/pyenv-win.git %USERPROFILE%\.pyenv

# Add to PATH
[Environment]::SetEnvironmentVariable("PATH", $env:PATH + ";%USERPROFILE%\.pyenv\pyenv-win\bin;%USERPROFILE%\.pyenv\pyenv-win\shims", "User")

Package Managers Comparison

System Package Managers

FeatureChocolateywingetScoopLinux (apt)
OfficialNoYesNoYes
Package countLargeGrowingMediumHuge
CLI focusMixedMixedYesMixed
Admin requiredSometimesSometimesNoYes (sudo)
ConfigurationXMLYAMLJSONText files

Language-Specific Package Managers

LanguageWindowsLinuxCross-platform
Pythonpippippip
Node.jsnpm, yarn, pnpmnpm, yarn, pnpmnpm, yarn, pnpm
JavaMaven, GradleMaven, GradleMaven, Gradle
Rustcargocargocargo
Gogo modulesgo modulesgo modules
Rubygemgemgem

Database Development

Database Servers

DatabaseWindows InstallationLinux InstallationDocker Option
PostgreSQLwinget install PostgreSQL.PostgreSQLsudo apt install postgresqldocker run postgres
MySQLwinget install Oracle.MySQLsudo apt install mysql-serverdocker run mysql
MongoDBwinget install MongoDB.ServerManual installationdocker run mongo
Rediswinget install Redis.Redissudo apt install redis-serverdocker run redis
SQLiteBuilt into many languagesBuilt into many languagesNot needed

Database Tools

ToolPurposeWindowsLinux
DBeaverUniversal DB clientYesYes
pgAdminPostgreSQL adminYesYes
MySQL WorkbenchMySQL adminYesYes
MongoDB CompassMongoDB GUIYesYes

Container and Virtualization

Docker Setup Best Practices

# docker-compose.yml for development
version: '3.8'
services:
app:
build: .
volumes:
- .:/app
- /app/node_modules # Performance optimization on Windows
ports:
- '3000:3000'
environment:
- NODE_ENV=development

WSL 2 Performance Optimization

# .wslconfig in Windows user directory
[wsl2]
memory=8GB
processors=4
localhostForwarding=true

Development Container Patterns

PatternUse CaseProsCons
Bind mountsLive developmentReal-time changesWindows performance
Named volumesDatabase storagePerformanceNot directly accessible
Dev containersConsistent environmentReproducibleInitial setup

Testing and CI/CD

Testing Frameworks

LanguageFrameworkWindowsLinuxWSL
JavaScriptJest, MochaYesYesYes
Pythonpytest, unittestYesYesYes
JavaJUnit, TestNGYesYesYes
C#NUnit, xUnitYesLimitedYes
Gobuilt-in testingYesYesYes

CI/CD Tools

ToolWindows AgentLinux AgentSelf-hosted
GitHub ActionsYesYesYes
Azure DevOpsYesYesYes
JenkinsYesYesYes
GitLab CIYesYesYes

Local CI/CD Testing

# GitHub Actions local testing
winget install nektos.act

# Run GitHub Actions locally
act -P ubuntu-latest=node:16-buster-slim

Performance and Debugging

Profiling Tools

LanguageWindows ToolsLinux ToolsCross-platform
Pythonpy-spy, cProfilepy-spy, perfpy-spy
Node.jsclinic.jsclinic.js, perfclinic.js
JavaJProfiler, YourKitJProfiler, async-profilerJProfiler
C/C++Visual Studio Profilergprof, perfNone built-in

Debugging Setup

VS Code Debugging:

{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal"
},
{
"name": "Node.js: Current File",
"type": "node",
"request": "launch",
"program": "${file}"
}
]
}

Security and Certificates

SSL/TLS Development

# Create self-signed certificate for development
New-SelfSignedCertificate -DnsName "localhost" -CertStoreLocation "cert:\LocalMachine\My"

# Export certificate
Export-Certificate -Cert $cert -FilePath "localhost.crt"

Development Security Tools

ToolPurposeWindowsLinux
OWASP ZAPSecurity testingYesYes
NmapNetwork scanningYesYes
WiresharkNetwork analysisYesYes
Burp SuiteWeb securityYesYes

Cross-Platform Development Tips

File System Considerations

  1. Case sensitivity: Linux is case-sensitive, Windows is not
  2. Path separators: Use path.join() or similar in code
  3. Line endings: Configure Git properly (core.autocrlf)
  4. File permissions: Different models between systems

Best Practices

  1. Use WSL for Linux-focused development
  2. Use Windows native tools for Windows-specific development
  3. Containerize applications for consistency
  4. Test on both platforms if targeting both
  5. Use cross-platform tools when possible
  6. Keep development environments isolated
  7. Document setup procedures for team consistency
  1. Primary development: WSL for most work
  2. GUI applications: Windows for testing/debugging
  3. Version control: Git in WSL with Windows credential manager
  4. IDE: VS Code with WSL extension
  5. Containers: Docker Desktop with WSL 2 backend
  6. Databases: Docker containers for isolation
  7. Testing: Both environments when targeting both platforms