Различают языки проекта для пакетов исходного кода Nuget

Допустим, я хочу создать пакет Nuget, который помещает файлы исходного кода в проекты Visual Studio, в которые он устанавливается. Ну, это хорошо работает с подходом "content".

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

.\ThePackage.nuspec
    └ content\TheFile.cs
    └ content\TheOtherFile.cs

С таким пакетом Nuget автоматически добавит файлы исходного кода в проекты напрямую. Однако это происходит с обоими файлами, поэтому я не нашел способа сделать это условным.

"Зачем?" Вы можете спросить - ну, у меня действительно нет двух cs файлы. У меня есть один для C# и один для Visual Basic, делающий то же самое на разных языках. Поэтому мне нужно различать файлы проекта C# и Visual Basic. Контентный подход выше с такой структурой...

.\ThePackage.nuspec
    └ content\TheFile.cs
    └ content\TheFile.vb

... вызовет смешивание с cs и vb файл в каждом проекте, конечно.

Есть ли способ сказать Nuget, что я просто хочу получить cs файл в проектах C# и vb файл в проектах Visual Basic без необходимости предоставления двух пакетов Nuget, таких как ThePackage for C# а также ThePackage for VB?

2 ответа

Решение

Вы можете добавить файл init.ps1 в ваш пакет nuget, который выполняется при установке. Там вы можете разместить некоторую логику, например, определить, какой язык используется в проекте и т. Д., И удалить / добавить ненужные или нужные файлы.

Для всех посетителей, которые ищут решение. С подходом PowerShell, предложенным @DJ, я остановился на этом сценарии ниже.


Пакет nuget содержит два файла содержимого:

content\XXXXXX.cs
content\XXXXXX.vb

При этом оба устанавливаются Nuget (в файловую систему и проект VS).

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

param($installPath, $toolsPath, $package, $project)


# All XXXXXX code files (for C# and VB) have been added by nuget because they are ContentFiles.
# Now, try to detect the project language and remove the unnecessary file after the installation.


function RemoveUnnecessaryCodeFile($project)
{
    $projectFullName = $project.FullName
    $codeFile = ""
    $removeCodeFile = ""

    if ($projectFullName -like "*.csproj*")
    {
        $codeFile = "XXXXXX.cs"
        $removeCodeFile = "XXXXXX.vb"
        Write-Host "Identified as C# project, installing '$codeFile'"
    }

    if ($projectFullName -like "*.vbproj*")
    {
        $codeFile = "XXXXXX.vb"
        $removeCodeFile = "XXXXXX.cs"
        Write-Host "Identified as VB project, installing '$codeFile'"
    }

    if ($removeCodeFile -eq "")
    {
        Write-Host "Could not find a supported project file (*.csproj, *.vbproj). You will get both code files and have to clean up manually. Sorry :("
    }
    else
    {
        # Delete the unnecessary code file (like *.vb for C# projects)
        #   Remove() would only remove it from the VS project, whereas 
        #   Delete() additionally deletes it from disk as well
        $project.ProjectItems.Item($removeCodeFile).Delete()
    }
}

RemoveUnnecessaryCodeFile -Project ($project)
Другие вопросы по тегам