Различают языки проекта для пакетов исходного кода 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)