为什么这个csc任务在Albacore不起作用?

时间:2014-10-15 12:36:46

标签: ruby cmd albacore

我编写了以下csc任务,用于使用Ruby / Rake / Albacore编译一些C#源代码。

csc :build do |csc|
  csc.command = 'csc.exe'
  csc.compile FileList['MyFolder/*.cs']
  csc.output = 'F:My.dll'
  csc.target = :library
end     

我得到了这个“没有方法”的错误

  

NoMethodError:main:Object

的未定义方法`csc'

我尝试直接在我的shell中调用命令

cmd> csc.exe /target:library /out:F:My.dll /warn:0 /nologo /debug MyFolder/*.cs

使用Ruby shell执行方法

system('csc.exe /target:library /out:F:My.dll /warn:0 /nologo /debug MyFolder/*.cs')    

我得到了这些错误!

  

错误CS2001:无法找到源文件'\ target:library'   错误CS2001:找不到源文件'F:My.dll'   错误CS2001:无法找到源文件'\ warn:0'   错误CS2001:找不到源文件'\ nologo'   错误CS2001:找不到源文件'\ debug'

我更改了Ruby shell execute方法以使用args数组参数

system('csc.exe', '/target:library', '/out:F:My.dll', '/warn:0', '/nologo', '/debug', 'MyFolder/*.cs')     

得到了不同的路径错误

  

错误CS1504:无法打开源文件'MyFolder \ my.cs'('系统无法找到指定的文件。')

我不知道为什么这不起作用。

2 个答案:

答案 0 :(得分:1)

使用Kernel#systemKernel#`

Dir.chdir('/path/to/the-directory/where/you-issued-the-command')
system('csc.exe /target:library /out:F:My.dll /warn:0 /nologo /debug MyFolder/*.cs')

chdir调用在您的情况下可能很重要,因为您必须在发出命令的同一目录中运行该命令(在cmd中)。

答案 1 :(得分:1)

对于初学者,我确定您使用的是错误版本的长鳍金枪鱼。 csc方法在Albacore 1.0的全局范围中定义,并且在Albacore 2.0中根本不存在。这就是您看到此错误的原因。

  

NoMethodError:未定义的方法' csc' for main:Object

你的Gemfile中可能有一个乐观的依赖

gem "albacore"

或使用unversioned gem install命令

$ gem install albacore

这将使用全新的API为您带来新发布的Albacore 2.0。如果您想继续使用该版本并且需要弄清楚如何拨打类似的电话,请查看the wiki。如果你想继续使用Albacore 1.0,请使用悲观版本运算符来获取任何1.x版本。

gem "albacore", "~> 1.0"

$ gem install albacore --version "~> 1.0"

您想要检查CSC task specification,官方1.0版本更改了一些属性和样式。

csc :build do |cmd|
  cmd.compile = FileList['MyFolder/*.cs']
  cmd.out = "F:/My.dll"
  cmd.target = :library
end

但是,根据您的原始system调用,您似乎仍然遇到某些文件路径或文件存在问题。在IRB中尝试一些File.exist?('foo')次调用,与Rakefile在同一个文件夹中,看看你得到了什么。

如果您在使用当前工作目录时遇到问题,则每个exec-based task(其中csc为1)都会继承一些额外的属性,您可能需要将working_directory设置为一些子路径。

csc :build do |cmd|
  cmd.working_directory = "foo"
  cmd.compile = FileList['MyFolder/*.cs']
  cmd.out = "F:/My.dll"
  cmd.target = :library
end