Можно ли сохранить содержимое папки в каталоге проекта, когда я ставлю в очередь новую сборку в TFS?


У меня проблема. Я использую Team Foundation Server 2017 RTM. У меня есть определение сборки, которое развернет мое приложение на сервере разработки под управлением Windows Server 2012 R2. Мое приложение позволяет пользователям загружать изображения и PDF-файлы. Когда это сделано, в корневом каталоге моего проекта создается папка с именем Media, и файлы загружаются сюда. Проблема в том, что всякий раз, когда я ставлю в очередь новую сборку, эта папка уничтожается, и все ссылки на носитель ни на что не указывают. Я довольно новичок в управлении и настройка TFS, поэтому мне было интересно, есть ли способ сохранить содержимое моей папки мультимедиа всякий раз, когда я ставлю в очередь новую сборку. Есть идеи?

2 2

2 ответа:

Согласно вашему описанию, в Агенте сборки существует концепция рабочего каталога. Если вы зададите clean=true в определении сборки, это приведет к удалению предыдущего вывода сборки при запросе новой сборки. Не зная, где находится папка мультимедиа, избегайте создавать/помещать ее в какой-либо каталог агента сборки, например Build.ArtifactStagingDirectory

Локальный путь к агенту, в который копируются все артефакты до их толкают к месту назначения. Например: c:\agent_work\1\a.

Типичный способ использования этой папки-публикация артефактов сборки с помощью шагов копировать файлы и публиковать артефакты сборки.

Примечание: этот каталог очищается перед каждой новой сборкой, поэтому вам не нужно очищать его самостоятельно.

Более подробную информацию о пути к папке в build / release вы можете найти в этом руководстве-- предопределенные переменные

Итак, я провел весь день, глядя на это.

В моем коде C# я создаю каталог примерно так:

// -- Create a new file name that is unique
string fileExtension = Path.GetExtension(upload.FileName);
Guid fileGuid = Guid.NewGuid();
string fileName = fileGuid + fileExtension;

// -- Create the directory and upload the image to that directory
string mediaDirectory = Server.MapPath("~/Media/");
Directory.CreateDirectory(mediaDirectory);
string filePath = Path.Combine(mediaDirectory, fileName);
upload.SaveAs(filePath);

Затем я бы установил url-адрес изображения на Медиаобъекте следующим образом:

string imageUrl = "/Media/" + fileName;

Так что теперь, вместо того, чтобы хранить изображение в базе данных, я просто сохраняю URL-адрес изображения.


Это было создание каталога в каталоге приложения, где я могу хранить файлы:

каталог приложений

Это круто, но, как я уже упоминал, этот каталог будет быть уничтоженным каждый раз, когда я ставлю в очередь новую сборку. Как я исправил это, чтобы изменить место, где я хранил изображения:

// -- Create a new file name that is unique
string fileExtension = Path.GetExtension(upload.FileName);
Guid fileGuid = Guid.NewGuid();
string fileName = fileGuid + fileExtension;

// -- Create the directory and upload the image to that directory
// The Media directory will be created on the C drive root
string mediaDirectory = @"c:\Media";
Directory.CreateDirectory(mediaDirectory);
string filePath = Path.Combine(mediaDirectory, fileName);
upload.SaveAs(filePath);

Теперь моя папка Media создана на диске C сервера и не будет уничтожена всякий раз, когда я ставлю новую сборку в очередь. Поскольку приложение не может получить доступ к файлам вне каталога приложений, мне нужен был способ получить доступ к этим файлам в каталоге мультимедиа. Что я сделал, так это создал новую виртуальную папку в IIS, которая указывает на папку Media и дает ей псевдоним Средства массовой информации:

Виртуальный каталог IIS

Теперь это позволит мне иметь доступ ко всем файлам, которые я помещаю в каталог мультимедиа, и правильно отображать изображения, когда это необходимо. Я очень надеюсь, что это кому-то поможет, потому что я слишком долго смотрел на это.