【问题标题】:dotnet-gitversion.exe /updateAssemblyinfo $destFileName /ensureassemblyinfo in paralleldotnet-gitversion.exe /updateAssemblyinfo $destFileName /ensureassemblyinfo 并行
【发布时间】:2022-02-21 17:17:33
【问题描述】:

我的程序使用dotnet-gitversion.exe /updateAssemblyinfo $destFileName /ensureassemblyinfo 从 git 标签中查找版本。它在几个项目中作为预构建事件完成。当我构建整个解决方案时,有时它们会并行运行并尝试同时写入$destFileName 并失败。

这是从 powershell 脚本调用的,我试图锁定文件并以某种方式将文件流传递给 dotnet-gitversion 但它不起作用,因为 dotnet-gitversion 接受文件路径而不是流。

你会寻找如何解决这个问题吗?

    标签: .net powershell gitversion


    【解决方案1】:

    根据实际的解决方案,这个答案可能会有所不同,但是如果正确理解你,你有两个任务你无法控制,这意味着你不能通过某种依赖或任何东西以串行方式完成它们?

    如果是这种情况,为了快速修复,如果可能的话,我会使用一个锁定文件并检查是否有其他进程使用它。如果需要,您甚至可以使用 lockfile 添加一些有关当前锁定它的任务的信息:

    $LockFile = "$destfilename.lock"
    #wait for lock to not be there anymore
    while(Test-path $lockfile)
    {
      #Waiting for lock to dissapear
      Write-host "Waiting for " + (get-content $lockfile) + " to finish.."
      start-sleep -seconds 10
    }
    #just to make sure system is updated on start of lockfile
    start-sleep -Milliseconds 300
    
    #create lockfile
    New-Item -itemtype File -path $lockfile -value $CurrentBuildTaskName -force
    
    #Do your thing here
    
    Remove-item -path $lockfile -force
    

    但是,从长远来看,我会尝试在某些情况下,在将“单个步骤”构建为主要构建的一部分时,您根本不执行这些步骤,而是将它们作为主要构建的一部分。这也节省了时间,因为您不必将基本相同的任务重复 2-3 次

    【讨论】:

    • 谢谢你的回复,我明白你的意思了。看起来那里有问题。当两个进程同时运行时,它们都将通过循环检查,创建锁,事物并删除它......
    • @Ashot 如果两者都在完全相同的时间开始,则可能存在竞争条件。如果它们碰巧同时运行,您可能想要添加start-sleep -Milliseconds (get-random -Minimum 0 -Maximum 300) 以在它们的开始处引入一些随机性。如果需要,您甚至可以考虑将随机数提高到 1000。您还可以做的是检查 dotnet-gitversion.exe 当前是否正在运行,而不是使用锁定文件
    猜你喜欢
    • 2022-06-03
    • 1970-01-01
    • 2018-06-02
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    相关资源
    最近更新 更多