Windows-way синхронізація параметрів між системами

Раз хабре почалася тиждень powershell, то я вирішив саме час з чернетки дістати статтю.
У той самий час коли був ZverCD, я эксперементировал з ubunta'ой і щиро дивувався чому не зроблять єдиний репозиторій для програм windows. З тих пір пройшло близько 5 років, і під windows з'явився пакетний менеджер. Добре в win10 зробили OneGet, але і без OneGet почали з'являтися аналоги. Свого роду проривом був chocolatey. Власне з написання скрипта під chocolatey почалася моя епопея з загальної тотальній синхронізації та переносимості. Кожна нова установка операційної системи, для мене виглядає запуском одного скрипта (в ідеальному світі так і є! ), з кожною новою установкою правда все більш і більш розширеним. Ця розповідь про те який софт я синхронизирую під windows чим і як.

Кожен раз, коли треба переїжджати з одного компа на інший, потрібно установка середовища звичної для мене. Це набір програм і налаштування гарячих клавіш. Спочатку це був просто php скрипт, але згодом він еволюціонував у powershell скрипт, з набором різних опціональних установок і завдань.
@powershell -NoProfile -ExecutionPolicy unrestricted -Command 
"iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" 
&& SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin 

choco install google-chrome-x64 
choco install sublimetext3 
choco install dropbox 
choco install puntoswitcher 
choco install skype 
choco install keepass 
choco install keepass-keepasshttp 
choco install git 
choco install sysinternals 
choco install kdiff3 
choco install gimp 
choco install fiddler4 
choco install tortoisegit 
choco install tortoisesvn 
choco install evernote 
choco install treesizefree 
choco install teamviewerr 

schtasks /Create /RU "Domain\Username" /SC ONLOGON /TN "autohotkey" /TR "D:\Dropbox\Apps\Autohotkey\runKeepass.exe" /IT /V1

cd %AppData%\Roaming\Sublime Text 3\Packages\ 
mklink /D User "d:\Dropbox\Apps\Sublime Text 3\User" 
cd /d "D:\Dropbox\Apps\powershell" 
@powershell .\copy_to_profile.ps1 


Для установки програм, я використовую chocolatey і скриптом запускаються початкові установки. Перше, що робимо — завантажуємо і встановлює chocolatey, хоча в планах зробити ще перевірку на win10 і OneGet.
Set-ExecutionPolicy RemoteSigned -Force
iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))


Info хто не хоче юзати choco на win10 машині, репозиторій сhocolatey доведеться додати в trusted source, щоб пакети не були обмежені майкрософтовським репозиторієм (в chocolatey в разів більше пакетів).

Далі ставимо софт на свій смак, ось мій:
  • google-chrome-x64
  • skype
  • sublimetext3
  • dropbox
  • puntoswitcher
  • keepass
  • keepass-keepasshttp
  • sysinternals
  • kdiff3
  • paint.net
  • gimp
  • fiddler4
  • evernote
  • treesizefree
  • teamviewer
  • git
  • tortoisegit
  • tortoisesvn
  • nodejs
  • ant


Додаємо трохи гарячих клавіш autohotkey скрпитом:

#k::
Run "C:\Program Files (x86)\KeePass Password Safe 2\Keepass.exe"

#IfWinActive ahk_class CabinetWClass ; for use in explorer.
^!Space::
ClipSaved := ClipboardAll
Send !d
Sleep 200 ; In some cases timeout settings have to be adjusted
Send ^c
Run, powershell -noexit -command "$exist=Test-Path '%clipboard%'; if($exist){Set-Location '%clipboard%' }else{Set-Location 'c:\'}"
Clipboard := ClipSaved
ClipSaved =
return
#IfWinActive
#IfWinNotActive
^!Space::Run, powershell -noexit -command "Set-Location 'c:\'"
#IfWinNotActive


Перша додає win+k на запуск keepass, база якого синхронізується через dropbox. А друга гаряча клавіша через Ctrl+Alt+Space відкриває powershell від адміна (без адміна як-то все зовсім кастрированно, і зручного аналога sudo я не знайшов). Причому якщо зараз активно вікно провідника, то відкриється консоль саме там де він зараз відкрито. Є ще зручне розширення для Visual Studio дозволяє відкривати ps з вікна солюшена: Open Command Line. Про нього писав Хансельман, ось тут Quake Console Mode for Visual Studio — Open a Command Prompt with a hotkey

А щоб цей скрипт працював правильно і з під адміна (знову каюсь, діра, але без адміна не працюють автохоткеи в тих додатках що запущені під адміном), то найпростіший шлях який я знайшов, це зробити завдання на вхід в систему, приблизно таким чином:
schtasks /Create /RU "Domain\Username" /SC ONLOGON /TN "autohotkey" /TR "D:\Dropbox\Apps\Autohotkey\runAutohotkey.exe" /IT /V1


Тепер приступимо до налаштування синхронізації додатків. Перше що синхронізуємо це Sublime Text. Процес синхронізації добре описаний тут. tl;dr робимо символічне посилання на папку dropbox'а для папки User %AppData%\Roaming\Sublime Text 3\Packages:

cd %AppData%\Roaming\Sublime Text 3\Packages\ 
mklink /D User "d:\Dropbox\Apps\Sublime Text 3\User" 


Для налаштування синхронізації Visual Studio, SQL Management Studio використовуються стандартні діалоги вивантаження і завантаження налаштувань у вигляді xml. Головна проблема полягає в тому, що генерується файл у форматі xml просто дампит всі зазначені параметри при експорті, і це мало юзабельно. Хотілося б успадкування від стандартної конфігурації general, або від c# для студії, і потім змінити свої налаштування Добре це вирішується в 2013 visual studio там це зробили через синхронізацію профілю visual studio online (подробиці msdn). Але що якщо нам треба просинхронизировать 2010, 2013, 2015, та й просто тримати під контролем ці налаштування, для цього доводиться робити кілька різних выгрузок конкретних параметрів (шортакаты, налаштування текстового редактора), і потім порівнювати з дефолтної. Ну порнографія загалом, по іншому не сказати.

Ще звісно хочеться щоб такі ж шортакты були і в Sublime Text і в WebStorm, і стандартного рішення, я поки не знайшов. Є хороший плагін для синхронізації налаштування колірної схеми, таби/прогалини, і купу інших параметрів форматування, але на жаль він не підтримує синхронізацію гарячих клавіш. Тим не менш він стоїть згадки: EditorConfig офф.сайт). Плагін активно розвивається, і багато чого хлопці пиляють/допиливают. Розширення для студії, теж єдиний спосіб синхронізації, який я знайшов: зберігати файли vsix розширень, і встановлювати їх через VSIXInstaller. Рядок запуску така:

cd "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE" .\VSIXInstaller.exe "D:\Dropbox\Apps\Visual Studio\extensions\VSColorOutput.vsix" 


Але оскільки розширення періодично застарівають, і ідея зберігати бінарники в dropbox мене якось не вразила, нічого краще, ніж пройтися за списком в Evernote, і завантажити їх руками, я не знайшов.

Невелике відхилення від теми. Крім розширень для студії, ще тепер я зберігаю скрипти для vcmd. Теоретично, у мене вони збережені на стековерфлоу, де розробник дуже активно відповідає на питання по тегу visual-studio. Пара прикладів:
Команда для копіювання поточного місця розташування у файлі
using EnvDTE;
using EnvDTE80;

public class C : VisualCommanderExt.ICommand
{
public void Run(EnvDTE80.DTE2 DTE, Microsoft.VisualStudio.Shell.Package package) 
{
EnvDTE.TextSelection ts = DTE.ActiveWindow.Selection as EnvDTE.TextSelection;
if (ts == null)
return;
EnvDTE.CodeFunction func = ts.ActivePoint.CodeElement[vsCMElement.vsCMElementFunction]
as EnvDTE.CodeFunction;
if (func == null)
return;

string result = DTE.ActiveWindow.Document.FullName + System.Environment.NewLine +
"Line " + ts.CurrentLine + System.Environment.NewLine +
func.FullName;
System.Windows.Clipboard.SetText(result);
}
}

автоматичне Збереження файлів при втраті фокуса вікна, Jetbrains-like
public class E : VisualCommanderExt.IExtension
{
public void SetSite(EnvDTE80.DTE2 DTE_, Microsoft.VisualStudio.Shell.Package package)
{
DTE = DTE_;
System.Windows.Application.Current.Deactivated += OnDeactivated;
}

public void Close()
{
System.Windows.Application.Current.Deactivated -= OnDeactivated;
}

private void OnDeactivated(object sender, System.EventArgs e)
{
try
{
DTE.ExecuteCommand("File.SaveAll");
}
catch (System.Exception ex)
{
}
}

private EnvDTE80.DTE2 DTE;
}


Для розгортання powershell профілю я написав такий скриптик:
cd /d " "D:\Dropbox\Apps\powershell" 
@powershell .\copy_to_profile.ps1 


Сам же скрипт з себе представляє наступний код
$scriptRoot = Split-Path $MyInvocation.MyCommand.Path

$profileFileInfo = New Object System.IO.FileInfo $PROFILE

$profileExist = Test-Path $profile
$modulesFolder = [System.IO.Path]::Combine($profileFileInfo.Directory,"Modules")

if(-not ((Test-Path $profile) -AND (Test-Path $modulesFolder)))
{
Write-Host "Creating directories"
New-Item -ItemType directory path $profileFileInfo.Directory -ErrorAction SilentlyContinue
New-Item -ItemType directory path $modulesFolder
}



Copy-Item -Path $scriptRoot\Microsoft.PowerShell_profile.ps1 -Destination $profile
Get-ChildItem Modules -Recurse |%{ Copy-Item $_.FullName -Destination $modulesFolder -Force}

Write-Host "Profile was updated"


Що відбувається в скрипті профілю: встановлюються більш трушные ( ;) ) кольору консолі і завантажуються всі скрипти і модулі з папки c Dropbox'а. У цих скриптах різні снипеты, заготовлені командлети та інші принади, модулі, наприклад posh-git. З часом у цій папці накопичилося вже пристойно скриптів, без яких я не уявляю ефективну роботу з ps. Але якщо у вас немає великого досвіду написання таких командлетів, то можете подивитися интерсные скрипти тут: microsoft scriptcenter. Ще дуже зручна тула для скриптинга: Script Browser & Script Analyzer 1.4

Невеликий p.s. замість закінчення. Сама стаття писалася протягом кількох років по абзацу, тому деякі дані могли застаріти. З відкритих питання синхронізація гарячих клавіш, якщо у кого є рецепт, буду дуже вдячний. Ще питання скриптинга для студії теж відкритий, т. к. розширення відмінне, але 39$ на мій погляд досить велика сума для розширення (той же resharper можна за 100$ на розпродажі взяти). Зміщення стека утиліт все таки з ухилом на .net стек, тому що основна робоча середовище. Для того ж WebStorm, IDEA, я так зрозумів вони самі якоюсь магією синхронізуються на компі, а кастомних клавіш я не биндил.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.