Подтвердить что ты не робот

*.dll.licenses в каталоге obj, не созданном с помощью msbuild в TeamCity

Я работаю над обновлением наших проектов TeamCity от VS2012 до VS2015, и у меня возникает проблема с компиляцией нашего приложения MVC.

Старый MSBuild (v4.0.30319.34209) создает файл в каталоге obj с именем MyApplication.Web.Mvc.dll.licenses, который, по-видимому, необходим для построения, но мы понятия не имеем, для чего этот файл фактически используется.

Новый MSBuild (v14.0.23107.0) не создает этот файл MyApplication.Web.Mvc.dll.licenses, поэтому сборка не выполняется со следующей ошибкой:

CSC error CS1566: Error reading resource 'MyApplication.Web.Mvc.dll.licenses' 
-- 'Could not find file 'C:\BuildAgent\work\58ddf5f1234d8c8a\application\MyApplication\MyApplication.Web.Mvc\obj\Release\MyApplication.Web.Mvc.dll.licenses'.' 

Я запускаю сборки вручную через cmd на машине, и файл dll.licenses создается при каждом запуске сборки, используя старый msbuild, а не новый.

Файл создается на машинах разработки под управлением VS2015, но не на сервере сборки Teamcity. Так мне кажется, что что-то еще устарело?

4b9b3361

Ответ 1

После немного большего количества поисковых запросов я наткнулся на этот поток на MSDN.

Предлагаемое решение - установить Windows 10 SDK. Мы сделали это на нашем сервере сборки TeamCity под управлением Windows Server 2012 R2, используя параметры установки по умолчанию, и после перезагрузки наша сборка снова работала.

Надеюсь, что это поможет:)

Ответ 2

Ответ "Установить Windows 10 SDK" правильный - в основном. Но есть дополнительная ошибка: существует более одной версии существующих SDK: https://developer.microsoft.com/en-us/windows/downloads/sdk-archive

При написании этого комментария:

  • Июль 2015 (версия 10.0.26624.0) содержит .NET Framework 4.6 SDK
  • ноябрю 2015 (версия 10.0.10586.212) содержит .NET Framework 4.6.1 SDK
  • августу 2016 (версия 10.0.14393.0) содержит .NET Framework 4.6.2 SDK

Проверьте выход VS 2015 и какую версию LC.exe вызывается. Затем установите соответствующий SDK на сервере сборки. Не забудьте также установить Microsoft Build Tools 2015.

Примечание. Моя сборка ориентирована на .net 4.5, но выше необходимо для создания на TeamCity с инструментами 2015 года.

Ответ 3

В моем случае TFS использовала компилятор лицензии lc.exe из старой папки SDK

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\lc.exe

вместо

C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\x64\LC.exe

Эта проблема была решена путем добавления в определение сборки следующего аргумента msbuild:

/p:FrameworkOverride="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.2"

Вы также можете избавиться от этих проблем и сделать вашу жизнь проще, установив визуальную студию на сервер сборки и добавив шаг визуальной студийной сборки, чтобы заменить шаг 2015 msbuild

Ответ 4

Я использую Atlassian Bamboo в качестве нашего сервера сборки, но в остальном имел точно такую ​​же проблему, описанную здесь. Я пробовал каждое решение в этой теме, но не мог заставить ничего работать. В конце концов, я использовал новую версию MSBuild, которая поставляется с Visual Studio 2017, и вдруг моя лицензионная dll была создана правильно. В моем случае файл MSBuild.exe можно найти по адресу:

C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\MSBuild.exe

Ответ 5

Может быть полезно кому-то:

После установки SDK Windows 10 и перезагрузки моего сервера я добавил /p:VisualStudioVersion=14.0 /p:TargetFrameworkVersion=v4.5.2 в файл msbuild.exe. Это разрешило это в моем случае.

Ответ 6

У нас была такая же проблема при создании с VisualBuild. Я нашел решение без установки Win10 SDK:

В свойствах проектов Compile Settings мы добавили "Командную строку события предварительного построения" следующим образом:

pushd "%VS120COMNTOOLS%..\..\VC"
call vcvarsall.bat
popd
pushd $(ProjectDir)\"My Project"
lc /target:$(TargetFileName) /complist:licenses.licx /outdir:"..\obj\$(ConfigurationName)"
popd
popd

Эта команда использует (старые) VS12 Tools и запускает инструмент компилятора lc вручную до сборки проекта и компилирует файл license.licx в файл ресурсов *.licenses

Ответ 7

Это тесно связанная, но немного отличающаяся ситуация, когда я использую Jenkins для управления сборкой...

Мне пришлось внести несколько изменений.

  • Установлен Windows 10 SDK на сервере сборки. В моем случае установка SDK "выявила" основную ошибку, которая заключается в том, что MSBuild не генерировал файл *.dll.licenses.
  • Добавил /tv:14.0 (/ToolsVersion:14.0) к моим параметрам сборки.

/p: Конфигурация = Выпуск /p: VisualStudioVersion = 14.0/tv:14.0/verbosity: Обычный

  1. Создал файл лицензии вручную как шаг перед выполнением шага MSBuild. Следующая команда создает файл "myproject.dll.licenses".

cd "C:\Program Files (x86)\Microsoft SDK\Windows\v10.0A\bin\NETFX 4.6.2 Инструменты"

.\lc.exe/target:MyProject.dll/complist: "C:\Program Files (x86)\Jenkins\jobs\MyProject\workspace\MyProject\license.licx" /i: "C:\Program Files\nsoftware\E-Payment Integrator V6.NET Edition\lib\nsoftware.InPayWeb.dll" /outdir: "C:\Program Files (x86)\Jenkins\jobs\MyProject\workspace\MyProject\obj\Release"

Ответ 8

В нашем случае мы используем Atlassian Bamboo в качестве сервера сборки с агентами сборки под управлением Windows Server 2012 (не R2). Поэтому установка Windows 10 SDK или Visual Studio Build Tools 2017 или 2019 не была возможной, поскольку она не будет установлена на Windows Server 2012, поскольку она не соответствует системным требованиям.

Я получил его, работая с событием перед сборкой, добавленным в проект VS. (Спасибо Джозефу Хаслингеру за идею)

Событие предварительной сборки, добавленное в свойства проекта, вызывает сценарий PowerShell со следующей командой: powershell.exe -ExecutionPolicy Bypass -NoProfile -NonInteractive -File $(ProjectDir)pre-build.ps1 $(ProjectDir) $(TargetFileName)

Команда основана на команде Йиржи Чинчуры со вкладками ↹ над ␣ ␣> пробелами

Я устанавливаю ExecutionPolicy на Bypass на случай, если кто-то не установит его на Unrestricted. Using Я использую NoProfile, так как я часто использую простой PowerShell, и загрузка моего профиля только немного замедлит его. Конечно NonInteractive, потому что, в общем, взаимодействие невозможно. И, наконец, File с моим файлом сценария.

Я добавил $(ProjectDir) как для вызова скрипта PowerShell, так и в качестве аргумента скрипта, первый для того, чтобы убедиться, что скрипт будет найден в агенте сборки (вероятно, не нужен, но для спокойствия...), второй, потому что [ В противном случае TG48] не найдет файл licenses.licx и выходной каталог. Другой аргумент $(TargetFileName) добавляет целевое имя проекта для использования в аргументе /target: команды LC.exe.

Сам скрипт PowerShell...

param(
    [String]$projectDir,
    [String]$targetFileName
)
if(Test-Path 'env:bamboo_agentId') {
    if(-not($projectDir)) { Throw "A value for -projectDir must be supplied!" }
    if(-not($targetFileName)) { Throw "A value for -targetFileName must be supplied!" }
    Write-Host "'r'nOn Bamboo build server, executing pre-build script"
    Write-Host "Supplied -projectDir: $projectDir"
    Import-Module NTFSSecurity

    trap {"Error found: $_"; exit 1;}
    $lcpath = Get-ChildItem2 -Path "C:\Program Files (x86)" -Filter "lc.exe" -Recurse -File | 
    Sort-Object -Property LastWriteTime -Descending | 
    Select-String -inputobject {$_.FullName} -Pattern ".*(x64|amd64).*" | 
    Select-Object -First 1

    $argTarget = "/target:$targetFileName"
    $argCompList = "/complist:$($projectDir)My Project\licenses.licx"
    $argOutdir = "/outdir:$($projectDir)obj\Release"

    Write-Host "'r'nCreating licenses file"
    Write-Host "Executing command: $lcpath $argTarget $argCompList $argOutdir"
    & $lcpath $argTarget $argCompList $argOutdir

} else {
    Write-Host "Not on Bamboo build server, skipping pre-build actions."
}

Сначала мы проверяем наличие переменной среды bamboo_agentId, которая указывает, что мы работаем с агентом сборки Bamboo, на локальном компьютере разработки нет необходимости выполнять сценарий. Когда мы узнаем, что работаем с агентом сборки Bamboo, мы проверяем, предоставлены ли оба аргумента. Затем мы будем искать в C:\Program Files (x86) самую последнюю 64-битную копию LC.exe. Далее мы создадим аргументы target, complist и outdir для LC.exe. И наконец, мы выполним команду LC.exe с ее аргументами.