如何在Fake.Deploy部署脚本中引用FakeLib.dll?

时间:2015-05-12 10:04:28

标签: f# f#-fake

我正在尝试从我的部署脚本中的本地Fake.Deploy安装中引用FakeLib.dll,但似乎找不到正确的使用路径。我发现Environment.CurrentDirectory指向我的Fake.Deploy安装,但只是使用

#r @"FakeLib.dll"

不起作用:

Deploy messages
{
  2015-05-12 09::22:50.413
  2015-05-12 09::22:50.417
  2015-05-12 09::22:50.417 Install.fsx(2,1): error FS0082: Could not resolve this reference. Could not locate the assembly "FakeLib.dll". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors. (Code=MSB3245)
  2015-05-12 09::22:50.432
  2015-05-12 09::22:50.432
  2015-05-12 09::22:50.433 Install.fsx(2,1): error FS0084: Assembly reference 'FakeLib.dll' was not found or is invalid
}

我在网上发现的示例建议在NuGet包中部署FAKE和我的应用程序,并像这样引用它:

#r @"tools\FAKE\tools\FakeLib.dll"

但这似乎有点过分和不必要的参考。

有谁知道引用本地Fake.Deploy安装的路径?

2 个答案:

答案 0 :(得分:1)

我自己找到了答案:部署后fsx脚本中用于引用的基本目录是 __ SOURCE_DIRECTORY __ ,即部署目录。

假设您的Fake.Deploy安装在

SELECT SUM(CASE WHEN a.fielda = b.fieldb THEN 1 ELSE NULL END) AS MatchCount
     , SUM(CASE WHEN a.fielda = x and b.fieldb = y THEN 1 ELSE NULL END) AS XYCount
     , COUNT(*) AS FieldDMatchCount
FROM tableA a
JOIN tableB b
  ON a.fieldd = b.fieldd

然后Environment.CurrentDirectory将指向此目录,而__SOURCE_DIRECTORY__将指向

 .\Fake.Deploy\

因此,您可以从部署后的fsx脚本中引用FakeLib.dll,如下所示:

.\Fake.Deploy\deployments\\{your_app}\active

我会尝试将此添加到documentation page

话虽如此,实际上还有一点需要与您的应用程序一起部署FAKE:

  • 确保使用正确的版本来运行部署脚本
  • Fake.Deploy安装可能不在您的控制之下,因此您可能无法通过权限访问其二进制文件
  • Fake.Deploy的配置允许指定不同的deplyoment位置(通过“WorkDirectory”),因此当使用非默认位置时,此硬编码路径将中断

答案 1 :(得分:0)

请注意,当您通过Fake.Deploy发送NuGet包时,代理会从与伪可执行文件相同的文件夹中运行包根目录中的脚本。因此,当您的fake.exe位于C:\ Fake \ tools \ fake.exe时,您的文件位于C:\ Fake \ tools \ deployments \ YourApplication \ active。如果您需要从该目录中读取属性文件或其他内容,您的脚本将无法看到它。因此,您需要在脚本中执行以下操作:

open System
open System.IO
let arguments = System.Environment.GetCommandLineArgs()
let script = arguments.[1]
let scriptDirectory = script.Replace(@"\NameOfMyDeployScript.fsx", @"")
System.IO.Directory.SetCurrentDirectory(scriptDirectory)

我想把它放在那里,所以没有人在尝试访问某些文件时失去理智。如果你不改变目录,你会看到这样的错误:

  

System.IO.FileNotFoundException:找不到文件'C:\ Fake \ tools \ myfile.properties'