Windows-way синхронизация настроек между системами

в 7:35, , рубрики: autohotkey, DropBox, powershell, sublime text, Visual Studio, windows, Windows 10, разработка под windows, системное администрирование

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

Каждый раз, когда надо переезжать с одного компа на другой, требуется установка среды привычной для меня. Это набор программ и настройка горячих клавиш. Сначала это был просто bat скрипт, но со временем он эволюционировал в powershell скрипт, с набором разных опциональных установок и заданий.

@powershell -NoProfile -ExecutionPolicy unrestricted -Command                                                                                                                      
"iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))"                                                                                
&& SET PATH=%PATH%;%ALLUSERSPROFILE%chocolateybin                                                                                                                             
                                                                                                                                                                                                                                            
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 "DomainUsername" /SC ONLOGON /TN "autohotkey" /TR "D:DropboxAppsAutohotkeyrunKeepass.exe" /IT /V1
                                                                                                                                                                                                                                            
cd %AppData%RoamingSublime Text 3Packages                                                                                                                                                
mklink /D User "d:DropboxAppsSublime Text 3User"                                                                                                                                                
cd /d "D:DropboxAppspowershell"                                                                                                                                                                          
@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 2Keepass.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 Mode Console for Visual Studio — Open a Command Prompt with a hotkey

А чтобы этот скрипт работал правильно и из под админа (опять каюсь, дыра, но без админа не работают автохоткеи в тех приложениях что запущены под админом), то самый простой путь который я нашел, это сделать задание на вход в систему, примерно таким образом:

schtasks /Create /RU "DomainUsername"    /SC ONLOGON /TN "autohotkey" /TR "D:DropboxAppsAutohotkeyrunAutohotkey.exe" /IT /V1

Теперь приступим к синхронизации настроек приложений. Первое что синхронизируем это Sublime Text. Процесс синхронизации описан хорошо здесь. tl;dr делаем символьную ссылку на папку dropbox'а для папки User из %AppData%RoamingSublime Text 3Packages:

cd %AppData%RoamingSublime Text 3Packages                                                                                                                                                
mklink /D User "d:DropboxAppsSublime Text 3User"                                                                                                                                                                                   

Для синхронизации настроек 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.0Common7IDE" .VSIXInstaller.exe "D:DropboxAppsVisual StudioextensionsVSColorOutput.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:DropboxAppspowershell"                                                                                                                                                                          
@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 $scriptRootMicrosoft.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, я так понял они сами какой-то магией синхронизируются на компе, а кастомных клавиш я не биндил.

Автор: IamKarlson

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js