Необходимо преобразовать обратные косые черты в прямые косые черты в рабочем потоке действий github

#windows #powershell #cmake #path #github-actions

#Windows #powershell #cmake #путь #github-действия

Вопрос:

В моем файле actions yml я устанавливаю переменную среды, указывающую на корневой каталог для моих файлов входных изображений ctest (я запускаю ctest для тестирования декомпрессора графического кодека, и это входные изображения).

 env:
  DATA_ROOT: ${{github.workspace}}/data
 

В Windows это дает мне что-то вроде c:FooBar/data , и я хотел бы преобразовать его в
c:/Foo/Bar/data

Я могу выполнить преобразование в PowerShell:

 $temp = ${DATA_ROOT}
$pattern = '[\]'
$temp = $temp -replace $pattern, '/'
 

но как мне затем сбросить ${DATA_ROOT} значение на равное $temp ?

Я хочу, чтобы в последующих шагах использовался новый $ {DATA_ROOT} .

Ответ №1:

Обратите внимание, что сейчас мне больно ${{github.workspace}} использовать разделители путей в Windows, нарушая любые действия «запуска» с использованием оболочки bash. Так что это не работает;

 defaults:
  run:
    shell: bash

jobs:
  build:
    steps:
    - name: Configure CMake
      run: cmake -B ${{github.workspace}}/build 
 

Обходной путь заключается в том, чтобы заключить одинарные кавычки '${{github.workspace}}/build' , которые не позволяют bash обрабатывать разделители путей как экранирующие.

Ответ №2:

Я не уверен, почему это помечено как CMake, но вы можете установить переменные среды в действиях GitHub, написав строку, содержащую NAME=VALUE to $GITHUB_ENV .

Из документации по действиям GitHub:

 echo "{name}={value}" >> $GITHUB_ENV
 

Создает или обновляет переменную среды для любых действий, выполняемых следующим в задании. Действие, которое создает или обновляет переменную среды, не имеет доступа к новому значению, но все последующие действия в задании будут иметь доступ. Переменные среды чувствительны к регистру, и вы можете включить знаки препинания.

Пример

 steps:
  - name: Set the value
    id: step_one
    run: |
        echo "action_state=yellow" >> $GITHUB_ENV
  - name: Use the value
    id: step_two
    run: |
        echo "${{ env.action_state }}" # This will output 'yellow'
 

Многострочные строки

Для многострочных строк вы можете использовать разделитель со следующим синтаксисом.

 {name}<<{delimiter}
{value}
{delimiter}
 

Для решения CMake, если у вас есть путь с потенциально смешанными косыми чертами, вы можете использовать file(TO_CMAKE_PATH)

 file(TO_CMAKE_PATH "c:\Foo\Bar/data" path)
message(STATUS "path = ${path}")  # prints: path = c:/Foo/Bar/data
 

Обратите внимание, что эта функция предполагает, что входящий путь является собственным путем для платформы, на которой запущен CMake. Таким образом, в Linux ввод с буквой диска будет недействительным ( : будет интерпретироваться как PATH разделитель и преобразован в a ; )