Я только начал играть с Azure DevOps, поскольку я хочу перенести все свои личные проекты на него, так как мне действительно нравится использовать его в офисе, но мне никогда не приходилось его настраивать, и я у меня первая проблема и надеюсь, что кто-то может помочь.
Я создал проект в DevOps и вложил свое основное решение в репозиторий. Все хорошо. Это решение имеет библиотеку зависимостей из другого проекта, поэтому я создал другой проект в DevOps и перенес эту библиотеку в репозиторий.
Мое основное решение (.sln), которое включает в себя проект для моего основного проекта, также включает ссылка на библиотеку и локальная компиляция решения работают, как и ожидалось, но когда я пробую это в DevOps, я получаю следующую ошибку:
D:\a\1\s\MyProject.sln.metaproj(0,0): Error MSB3202: The project file
"D:\a\1\s\..\..\..\Libraries\MyLibrary\MyLibraryAPI\MyLibraryAPI.csproj"
was not found.
, и в результате я получаю кучу других ошибок, похожих на ниже, так как не удалось скомпилировать библиотеку, на которую ссылается решение, но которая находится в совершенно другом проекте в DevOps:
MyProject\Controllers\MembersController.cs(8,7): Error CS0246: The type or namespace name
'MyLibraryAPI' could not be found (are you missing a using directive or an assembly
reference?)
Ясно, что не могу найти проект в DevOps, но как я могу решить эту проблему? Я все еще хочу убедиться, что эта библиотека компилируется каждый раз, когда я компилирую свой основной проект.
Я только немного прочитал YAML, и я предполагаю, что мне, возможно, придется что-то там изменить, но я ' Я не уверен, что быть честным. В любом случае, я буду ждать чьей-то обратной связи и надеюсь, что вышеизложенное имеет смысл, и что кто-то может прояснить, как я могу решить эту проблему.
Спасибо.
ОБНОВЛЕНИЕ-1
Спасибо за подробный отзыв @MerlinLiang. Я следовал инструкциям по ссылке, предоставленной @FrankAlvaro и вашей, и они действительно одинаковы, но я ценю дополнительную информацию, поскольку я столкнулся с этой проблемой, связанной с ошибкой:
The Git repository with name or identifier {repos name}does not exist
or you do not have permissions for the operation you are attempting
Но я до сих пор нет ' т решил проблему. Теперь я получаю следующую ошибку:
##[error]d:\a\1\s\MyProject\MyProject.sln.metaproj(0,0):
Error MSB3202: The project file "d:\a\1\s\MyProject\..\..\..\Libraries\
MyLibrary\MyLibraryAPI\MyLibraryAPI.csproj" was not found.
Помните, что MyProject - это мое основное решение, в котором есть ссылка на мою MyLibrary, но странно видеть, что он пытается поместить MyLibrary \ MyLibraryAPI внутри MyProject как локально они находятся в другом месте, так что, хотя я понимаю, что в Azure DevOps все будет по-другому, я бы подумал, что при проверке проекта он попытался бы соблюдать структуру папок, используемую локально, не так ли?
Я не знаю, поможет ли это решить мою проблему, но вот как определяются проекты в моем файле .sln:
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyProject",
"MyProject\MyProject.csproj", "{CD02E7AD-97EE-4831-A18D-A57E2CC92E08}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyLibraryAPI",
"..\..\..\Libraries\MyLibrary\MyLibraryAPI\MyLibraryAPI.csproj",
"{82A7849D-22EF-4889-A7A6-2AE7D3F98F77}"
EndProject
UPDATE-2
Я попробовал то, что предложил @MerlinLiang, установив путь, но я не уверен, что я делаю правильно, поскольку он все еще не работает, как ожидалось. Вот что я сделал:
- Установите путь для MyProject
Установите путь для переменных MyLibraryAPI
: решение: '** / * .sln 'buildPlatform:' Any CPU 'buildConfiguration:' Release 'MyProjectCheckoutPath:' Repos \ Work \ Company \ MyProject 'MyLibraryApiCheckoutPath:' Repos \ Libraries \ MyLibrary '
шаги:
- checkout: self path: '$ (MyProjectCheckoutPath)'
- checkout: MyLibrary path: '$ (MyLibraryApiCheckoutPath)'
Примечание: MyLibrary - это мое решение папка, которая содержит 2 папки, одна из которых называется MyLibraryAPI, которая содержит MyLibraryAPI.csproj, а другая - просто консольное приложение, используемое для тестирования библиотеки, но не обязательное. Я не уверен, как конкретно указать, чтобы использовать проект MyLibraryAPI только, поскольку он содержится в репо, который содержит 2 папки. Я надеюсь, что это имеет смысл.
Когда я указываю вышеуказанный путь в YAML и запускаю конвейер, я получаю следующие предупреждения:
Repository is current at 'D:\a\1\s\My Project', move to
'D:\a\1\Repos\Work\Company\MyProject'.
##[warning]Unable move and reuse existing repository to required location.
Repository will be located at 'D:\a\1\Repos\Work\Company\MyProject'.
Repository is current at 'D:\a\1\s\MyLibrary', move to
'D:\a\1\Repos\Libraries\MyLibrary'.
##[warning]Unable move and reuse existing repository to required location.
Repository will be located at 'D:\a\1\Repos\Libraries\MyLibrary'.
Как видите, оба дают предупреждение, когда я пытаюсь использовать пути, определенные в моих переменных.
Поскольку это только предупреждение, оно продолжается при сборке, но в итоге я получаю сообщение об ошибке в разделе VSBuild:
##[error]Solution not found using search pattern 'D:\a\1\s\**\*.sln'.
Я пытался изменить переменную решения в моем YAML на MyProject
variables:
solution: '**/MyProject.sln'
Но я все равно получаю сообщение об ошибке, поскольку путь явно отличается:
##[error]Solution not found using search pattern
'D:\a\1\s\**\MyProject.sln'.
Я не уверен, правильно ли я определяю путь, когда получаю предупреждения, но, если предположить, что он как-то сработал, путь решения все еще остается проблемой.
Есть идеи?
ОБНОВЛЕНИЕ-3
На секунду я подумал, что сортировал его, так как VSBuild потребовалось больше времени, чем обычно, чтобы выйти из строя, но безрезультатно. Я изменил путь решения, чтобы использовать полный путь MyProject:
, но в итоге получил следующую ошибку:
"D:\a\_tasks\VSBuild_71a9a2d3-a98a-4caa-96ab-
affca411ecda\1.166.0\ps_modules\MSBuildHelpers\vswhere.exe"
-version [16.0,17.0) -latest -format json
"C:\Program Files (x86)\Microsoft Visual
Studio\2019\Enterprise\MSBuild\Current\Bin\msbuild.exe"
"D:\a\1\s\Repos\Work\Company\MyProject\MyProject.sln" /nologo /nr:false
/dl:CentralLogger,"D:\a\_tasks\VSBuild_71a9a2d3-a98a-4caa-96ab-
affca411ecda\1.166.0\ps_modules\MSBuildHelpers\
Microsoft.TeamFoundation.DistributedTask.
MSBuild.Logger.dll";"RootDetailId=7d46ac00-083a-434d-9729-
be159b80eea4|SolutionDir=D:\a\1\s\Repos
\Work\Company\MyProject"*ForwardingLogger,"D:\a\_tasks\
VSBuild_71a9a2d3-a98a-4caa-96ab-
affca411ecda\1.166.0\ps_modules\MSBuildHelpers\
Microsoft.TeamFoundation.DistributedTask.MSBuild.Logger.dll"
/p:DeployOnBuild=true /p:WebPublishMethod=Package
/p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true
/p:PackageLocation="D:\a\1\a" /p:platform="Any CPU"
/p:configuration="Release" /p:VisualStudioVersion="16.0"
/p:_MSDeployUserAgent="VSTS_aa0b7157-846e-49d9-8668-38efaf1e9745_build_5_0"
MSBUILD : error MSB1009: Project file does not exist.
Switch: D:\a\1\s\Repos\Work\Company\MyProject\MyProject.sln
##[error]Process 'msbuild.exe' exited with code '1'.
Finishing: VSBuild
UPDATE-4:
Я пытался создать каталог через Powerscript, как предложено в
Предупреждение при загрузке дополнительных репозиториев
, но это не решило проблему. Я также добавил скрипт для отображения содержимого каталога, в который он должен извлекать файлы из репозиториев, и оба каталога отображаются пустыми.
Вот мой полный YAML:
resources:
repositories:
- repository: MyLibrary
type: git
name: MyLibrary/MyLibrary
trigger:
- master
pool:
vmImage: 'windows-latest'
variables:
solution: 'Repos\Work\Company\MyProject\MyProject.sln'
buildPlatform: 'Any CPU'
buildConfiguration: 'Release'
myLibraryCheckoutPath: 'Repos\Libraries\MyLibrary'
myProjectCheckoutPath: 'Repos\Work\Company\MyProject'
steps:
- task: PowerShell@2
displayName: "Create repository folder $(myProjectCheckoutPath)"
inputs:
targetType: inline
script: |
New-Item -Path . -Name "$(myProjectCheckoutPath)" -ItemType "directory"
pwsh: true
- checkout: self
path: '$(myProjectCheckoutPath)'
- script: dir
workingDirectory: $(myProjectCheckoutPath)
displayName: List contents of a folder for MyProject
- task: PowerShell@2
displayName: "Create repository folder $(myLibraryCheckoutPath)"
inputs:
targetType: inline
script: |
New-Item -Path . -Name "$(myLibraryCheckoutPath)" -ItemType "directory"
pwsh: true
- checkout: MyLibrary
path: '$(myLibraryCheckoutPath)'
- script: dir
workingDirectory: $(myLibraryCheckoutPath)
displayName: List contents of a folder for MyLibrary
- task: NuGetToolInstaller@1
- task: NuGetCommand@2
inputs:
restoreSolution: '$(solution)'
- task: VSBuild@1
inputs:
solution: '$(solution)'
msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package
/p:PackageAsSingleFile=true
/p:SkipInvalidConfigurations=true
/p:PackageLocation="$(build.artifactStagingDirectory)"'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
# - task: VSTest@2
# inputs:
# platform: '$(buildPlatform)'
# configuration: '$(buildConfiguration)'
ОБНОВЛЕНИЕ 5
Я все еще не понимаю, что происходит.
Когда я проверяю 2 проекта, я получаю следующее:
- Directory created: D:\a\1\s\Repos\Work\Company\MyProject
- Directory created: D:\a\1\s\Repos\Libraries\MyLibrary
И в журналах я получаю следующий вывод:
- Repository is current at
'D:\a\1\s\MyProject', move to
'D:\a\1\s\Repos\Work\Company\MyProject'
(##[warning]Unable move and reuse existing repository to required location)
- Repository is current at
'D:\a\1\s\MyLibrary', move to
'D:\a\1\s\Repos\Libraries\MyLibrary'
(##[warning]Unable move and reuse existing repository to required location)
и, как вы можете видеть, если все еще не удается извлечь соответствующие репозитории и переместить их в соответствующий каталог.
Тем не менее, когда я просто извлекаю один репозиторий, т.е. MyProject, в журнал выводится следующее:
Repository is current at
'D:\a\1\s', move to 'D:\a\1\s\Repos\Work\Company\MyProject'.
Repository will be located at
'D:\a\1\s\Repos\Work\Company\MyProject'.
И это работает, как и ожидалось.
В обоих сценариях ios, root равен 'D: \ a \ 1 \ s', но при его извлечении текущий каталог такой же, но при использовании с 2 это root каталог и название проекта. Вы могли бы подумать, что это должно быть в порядке, но это явно не так, поскольку не удается переместить файлы.
Одна вещь, которую я тоже не понимаю, это в соответствии с Проверьте несколько хранилищ в вашем конвейере , есть примечание, в котором говорится:
Если вы используете пути по умолчанию, добавление второго шага проверки хранилища изменяет путь по умолчанию кода для первого хранилища. Например, код для репозитория с именем tools будет извлечен в C: \ agent_work \ 1 \ s, когда tools является единственным репозиторием, но если будет добавлен второй репозиторий, инструменты будут затем извлечены в C : \ agent_work \ 1 \ s \ инструменты. Если у вас есть какие-либо шаги, которые зависят от исходного кода, находящегося в исходном местоположении, эти шаги должны быть обновлены.
Что означает
"Если у вас есть какие-либо шаги, которые зависят от исходного кода, находящегося в исходном расположении, эти шаги должны быть обновлены "
Какие шаги и обновить их до какого ??
Я прочитал так много документации Я часами гуглял и пробовал так много комбинаций YAML, но безрезультатно. Я просто не могу найти решение. Извините, если мне чего-то не хватает, но я просто не понимаю, почему это работает с одним репо и не работает с 2.