如何从Azure函数引用其他Powershell函数?

时间:2019-07-12 18:33:36

标签: azure powershell azure-functions

如何在用powershell编写的Azure函数的run.ps1文件中引用其他powershell函数?

详细信息:

我有25个私有的“帮助程序”函数,它们已经编写了帮助操作数据,哈希表的函数,通常使我更容易在Powershell中编写脚本。我一直在不断更改这些功能并为其添加功能,我更希望将它们分组在lib文件夹中,然后在Azure函数冷启动时导入。

我可以通过在run.ps1文件的顶部包含“帮助器”功能来完成所有这些工作(我不想这样做,因为这听起来很笨拙,并且不允许我将每个功能分成是自己的文件)。

如何通过将所有功能分离到各自的文件中,然后进行源/导入的工作来使其工作?

我尝试这样设置文件夹结构:

FunctionApp
 | - host.json
 | - profile.ps1
 | - lib
 | | - helperfunction1.ps1
 | | - helperfunction2.ps1
 | | - helperfunction3.ps1
... (etc)
 | - myFunction
 | | - function.json
 | | - run.ps1

然后我在profile.ps1文件中使用以下代码导入每个函数:

$functionFiles = Get-ChildItem -Path "$PSScriptRoot\lib" -Filter *.ps1
Write-Information "Loading scripts"
foreach($file in $functionFiles){
    Write-Information "Sourcing $($file.FullName)"
    . $file.FullName
}

当我在本地运行/测试时,一切工作都很好,但是当我部署到Azure时,此堆栈跟踪会失败:

2019-07-12T18:25:10.461 [Error] Executed 'Functions.HttpTriggerClientIssues' (Failed, Id=bf6fccdd-8972-48a0-9222-cf5b19cf2d8e)
Result: Failure
Exception: Value cannot be null.
Parameter name: value
Stack:    at Google.Protobuf.ProtoPreconditions.CheckNotNull[T](T value, String name)
   at Microsoft.Azure.WebJobs.Script.Grpc.Messages.StreamingMessage.set_RequestId(String value) in C:\projects\azure-functions-powershell-worker\src\Messaging\protobuf\FunctionRpc.cs:line 309
   at Microsoft.Azure.Functions.PowerShellWorker.Utility.RpcLogger.Log(Level logLevel, String message, Exception exception, Boolean isUserLog) in C:\projects\azure-functions-powershell-worker\src\Logging\RpcLogger.cs:line 46
   at Microsoft.Azure.Functions.PowerShellWorker.PowerShell.PowerShellManager.InvokeProfile(String profilePath) in C:\projects\azure-functions-powershell-worker\src\PowerShell\PowerShellManager.cs:line 181
   at Microsoft.Azure.Functions.PowerShellWorker.PowerShell.PowerShellManager.Initialize() in C:\projects\azure-functions-powershell-worker\src\PowerShell\PowerShellManager.cs:line 106
   at Microsoft.Azure.Functions.PowerShellWorker.PowerShell.PowerShellManagerPool.CheckoutIdleWorker(StreamingMessage request, AzFunctionInfo functionInfo) in C:\projects\azure-functions-powershell-worker\src\PowerShell\PowerShellManagerPool.cs:line 99
   at Microsoft.Azure.Functions.PowerShellWorker.RequestProcessor.ProcessInvocationRequest(StreamingMessage request) in C:\projects\azure-functions-powershell-worker\src\RequestProcessor.cs:line 235

我很困惑为什么它在本地而不是在Azure中工作。最后,我真的很想能够在自己的文件中定义所有函数,一次导入它们,并能够在我的run.ps1文件中使用它们(甚至更好,如果我在其中创建了多个HTTP触发器,相同的FunctionApp,我希望能够在触发器之间共享我的助手功能)

1 个答案:

答案 0 :(得分:1)

我明白了。

将您的助手功能放置在Modules文件夹内的.psm1文件中,如下所示:

FunctionApp
 | - host.json
 | - profile.ps1
 | - Modules
 | | - helperfunction1.psm1
 | | - helperfunction2.psm1
 | | - helperfunction3.psm1
... (etc)
 | - myFunction
 | | - function.json
 | | - run.ps1

即使documentation当前说您的助手功能将自动可用,但根据我的经验,您仍然需要导入文件:

#in profile.ps1:
foreach($file in Get-ChildItem -Path "$PSScriptRoot\Modules" -Filter *.psm1){
    Import-Module $file.fullname
}

这似乎现在对我有用。

谢谢〜!