【问题标题】:How do I run a Rake task every time a file is saved in Visual Studio?每次在 Visual Studio 中保存文件时,如何运行 Rake 任务?
【发布时间】:2013-01-21 11:34:19
【问题描述】:

每次在 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]

【问题讨论】:

    标签: visual-studio-2012 rake


    【解决方案1】:

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

    @ECHO OFF
    rake
    

    我为工具分配了快捷键CTRL + S,这样,当我保存时,就会触发rake任务!我希望这对希望做同样事情的人有所帮助。

    【讨论】:

    • 这个实现是否仍然执行内置保存?还是你失去了这种能力?很高兴看到批处理文件的内容。
    • Anthony,我的 bat 文件只是一个衬里,它包含的只是 Rake 我所做的就是调用默认的 rake 任务。
    • 我的 rake 文件如下 ----- 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" 结束任务:default => [:Build, :测试] 是的 Ctrl + S 仍然可以正常工作,好处是如果解决方案中没有批处理文件,则不会出现任何问题并且不会出现错误。
    • 酷,所以你依赖于系统范围内安装的 Ruby/Rake,所以它在你的 PATH 中。您可以从任何命令行调用它。这是开始的好方法!我很惊讶 CTRL + S 可以重新分配给您的外部工具并且仍然保存文件。我不知道VS可以做到这一点。我得去看看。
    【解决方案2】:

    可能有一些与命令行集成的选项对 Visual Studio 是一无所知的。

    Ruby/Guard 方式

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

    gem install guard
    gem install guard-rake
    

    您可以创建一个 Guard“模板”,一个 Guardfile,其中包含一个普通的 Rake 任务

    guard init rake
    

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

    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'
    

    【讨论】:

    • 哇,安东尼!感谢您分享您的实现。我猜你的解决方案比我的更怪异:) 当然更专业,但我选择了一个更简单的解决方案,它对我很有用。最好的事情是,因为我的外部命令在解决方案目录中查找批处理文件,如果它没有找到它不会中断。我也喜欢你的实现,当我弄乱 powershell 时我会试一试。谢谢:)
    • 你问了一个好问题。我想我会尝试这个作为我的解决方案。如果喜欢,请点赞!
    最近更新 更多