В то самое время когда был 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%\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 Mode Console 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, я так понял они сами какой-то магией синхронизируются на компе, а кастомных клавиш я не биндил.
Комментарии (19)
navion
08.03.2016 19:12По-настоящему windows-way — это написание правил для USMT. А за Chocolatey спасибо, интересная штука.
alk
08.03.2016 23:08Я бы рекомендовал portableapps.com с очень приличным набором портативных приложений, перенос которых с компьютера на компьютер сводится к копированию папки portableapps с всем ее содержимым
IamKarlson
09.03.2016 07:20Вопрос в необходимости таскания с собой винчестера. И постоянно копировать на него актуальный слепок этой папки. Ну и облака там, 2016 год, все дела.
alk
09.03.2016 09:51кто мешает хранить папку portableapps в облаке, в том же dropbox'е? тогда и копировать ничего вручную не придется, все само приедет на новый компьютер
IamKarlson
09.03.2016 12:16Ну у меня есть два аргумента против.
1) идея хранить бинарники в облаке мне не нравится
2) обновление программalk
09.03.2016 13:38Портативный Firefox обновляется также легко, как и настоящий. У других с этим делом похуже, но если приложение некритичное в плане безопасности, то можно и обновлять время от времееи вручную или не обновлять вовсе.
А что может быть страшного в хранении какого-нибудь scanner.exe который я использую вместо treesize
kvaps
09.03.2016 11:53Отличный пример, спасибо!
Теперь можно хранить свои windows-"dotfiles" в github так же просто как и в *nix.
PNAGAEV
10.03.2016 09:17в этой папке накопилось уже прилично скриптов, без которых я не представляю эффективную работу с ps
А можно поподробнее, плиз.IamKarlson
10.03.2016 09:49можно, только не знаю как. Или отдельным постом, или в этот добавить, или в комент запихнуть.
PNAGAEV
10.03.2016 10:52Да наверное отдельным постом, чтобы народ в комментах накидал своих полезных скриптов. Обмен опытом это всегда хорошо.
pak-nikolai
10.03.2016 22:53choco удобная штука, по psremoting прицепляюсь к нужному клиенту, ставлю choco с софтом.
автообновление проиходит само, таким образом нет необходимости давать клиенту админский пароль, софт можно доставить или удалить, обновляться все будет одной командой — choco upgrade all которую можно вытолкнуть как со своего компа так и скомпа клиента через шедулер. для структуры с ноутбучниками и любителями постоянно обновляющегося софта типа жавы и акробата самое то.
belonesox
11.03.2016 18:23Вот как бы еще автоматом поставить SlimDrivers и чтобы он все драйверы, не требуя кликинга поставил...
Ivan_83
В до вистовые времена можно было просто копировать профиль целиком, и после некоторых не сложных манипуляций система принимала его как родной.
Плохо что мс это убило, это была одна из многих причин почему я перестал пользоваться их поделиями.
MagicGTS
И сейчас без особых сложностей принимает. Проблемы могут возникать из-за guid учетки, который некотоые программы любят тящить с собой. Еще между разными версиями винды нельзя простой подменой делать перенос (как межу 32 и 64 редакциями, так и между версиями Windows).
Ivan_83
Хз, я просто брал копировал весь профиль, переставлял систему, потом заводил учётку с таким же логином, логинился один раз, потом выходил, удалял созданный профиль, копировал вместо него тот что сохранял ранее и… в ХР нужно было сбросить права в реестре и на файлы а в семёрке оно не работает никак.
2 IamKarlson:
Портабле версии лепить в профиль, если оч надо.
Я делал просто папку Files/Programs, и туда ставил всякие портабле нужные и прочие проги которым пофиг на установку, переносил винраром, с правами доступа (там права стояли так что изменять исполняемые файлы было нельзя, только конфиги, если они у софтины в каталоге стояли).
Сейчас на фрю переехал и вообще проблем нет, просто rsync~ом на любой приглянувшийся+подходящий носитель копирую систему с профилем, софтом и всеми настройками, потом редактирую пару файлов чтобы бутилось и всё.
2 navion:
Нету виндового пути, НЕТУ и не было. В каждой версии свои приколы были.
Виндовс идеология это:
1. семь бед один ресет (в основном до ХР эпоха)
2. проще=быстрее систему переустановить чем вылечить/исправить
3. проще мышкой настроить с нуля чем пытаться перенести настройки
IamKarlson
А с софтом как быть?