每次在Visual Studio中保存文件时,如何运行Rake任务?

时间:2013-01-21 11:34:20

标签: visual-studio-2012 rake

每次在Visual Studio中保存文件时,如何自动运行rake脚本?我可以创建一个包装命令的批处理文件。我想在CTRL + S上触发它。但是,Visual Studio 2012没有宏。

JP Boodhoo已经在他的许多屏幕演员中完成了,但还没有分享实现。


仅供参考,我的rakefile看起来像这样

require 'albacore'

desc 'Build Solution'
msbuild :Build do |msb| 
  msb.properties :configuration => :Release 
  msb.targets :Clean, :Build 
  msb.solution = 'ProjoBot.sln' 
end 

desc 'Run Unit Tests' 
mspec :Test do |mspec| 
  mspec.command = 'Lib/Tools/MSpec/mspec-clr4.exe' 
  mspec.assemblies 'Src/Tests/ProjoBot.UnitSpecifications/bin/Release/ProjoBot.UnitSpecifications.dll'
end 

task :default => [:Build, :Test]

2 个答案:

答案 0 :(得分:1)

我使用外部工具运行执行默认Rake任务的批处理文件。

@ECHO OFF
rake

我将快捷键CTRL + S分配给工具,这样,当我保存时,会触发rake任务!我希望这可以帮助那些想要做同样事情的人。

答案 1 :(得分:1)

可能有一些选项与命令行集成,不知道Visual Studio。

Ruby / Guard Way

昨晚我正在玩Guard gem。你基本上安装了后卫和Guard rake plugin

gem install guard
gem install guard-rake

你可以创建一个Guard“模板”,一个带有普通Rake任务的Guardfile

guard init rake

例如,您可以对其进行编辑以观看.cs目录中的source个文件。 (和

guard 'rake', :task => 'default', :run_on_start => false do
  watch(%r{^source/.+\.cs$})
end

然后启动Guard

guard

您可能需要使用-i关闭此“交互式”模式,这可能会在Windows上生成错误!

guard -i

Guard像一个小型本地服务器一样运行,显示日志

12:07:08 - INFO - Guard uses TerminalTitle to send notifications.
12:07:08 - INFO - Starting guard-rake default
12:07:08 - INFO - Guard is now watching at 'D:/temp'
[1] guard(main)>

如果您强制更改文件(我将touch我在我的测试目录中设置的假文件),您将获得您的rake任务的输出!

12:07:08 - INFO - Guard uses TerminalTitle to send notifications.
12:07:08 - INFO - Starting guard-rake default
12:07:08 - INFO - Guard is now watching at 'D:/temp'
12:07:54 - INFO - running default
building!...
[1] guard(main)>

PowerShell方式

没有什么可以包含文件系统轮询触发的操作,但这并不意味着你无法建立自己的!我写了一个.\guard.ps1文件,它位于我的解决方案根目录中。它有FileSystemWatcher并等待循环中的更改。

$here = Split-Path $MyInvocation.MyCommand.Definition

$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "$here\source"
$watcher.IncludeSubdirectories = $true

while($true) {
  # timeout here lets the console process kill commands and such
  $result = $watcher.WaitForChanged('All', 3000)

  if($result.TimedOut) {
    continue
  }

  # this is where you'd put your rake command
  Write-Host "$($result.ChangeType):: $($result.Name)"

  # and a delay here is good for the CPU :)
  Start-Sleep -Seconds 3
}

您可以在touch或创建(New-Item <name> -Type File)文件时看到它正常工作和打印。但是,我们也可以非常简单地执行rake

rake

PowerShell将继续执行它作为本机命令。你可以想象一下,让这个脚本看起来更像是Guard(好吧,不是更多,但有点!)

param(
  [string] $path = (Split-Path $MyInvocation.MyCommand.Definition),
  [string] $task = 'default'
)

$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = $path
$watcher.IncludeSubdirectories = $true

while($true) {
  $result = $watcher.WaitForChanged('All', 3000)

  if($result.TimedOut) {
    continue
  }

  rake $task

  Start-Sleep -Seconds 3
}

你会像这样执行它

.\guard.ps1 -Path "$pwd\source" -Task 'build'