#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 ;
)