Убедитесь, что между проектами решений нет ссылок на файлы - PullRequest
0 голосов
/ 28 декабря 2018

Предположим, что в решении .NET есть два проекта:

Solution
    - Project1
    - Project2

Я хочу иметь только Project References от Project2 до Project1, например:

<ItemGroup>
  <ProjectReference Include="Project1.csproj" />
</ItemGroup>

Но иногда разработчики добавляют неправильноFile References вместо этого вроде:

<ItemGroup>
  <Reference Include="Project1">
    <HintPath>path\to\Project1.dll</HintPath>
  </Reference>
</ItemGroup>

Как я могу быть уверен, что между проектами решений нет File References?В идеале это должна быть ошибка сборки, но как лучше ее реализовать?

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Я нашел решение.Можно добавить задачу MSBuild (цель), которая проверяет все проекты решений на наличие ссылок на файлы.Эта задача должна быть добавлена ​​ко всем проектам или к Directory.Build.targets.Это цель:

<Project>
  <Target Name="BeforeBuild">
    <Message Text="Analyzing '$(MSBuildProjectFile)' for file references between solution projects...&#xA;" />

    <GetSolutionProjects Solution="$(MSBuildThisFileDirectory)\YourSolutionName.sln">
      <Output ItemName="Projects" TaskParameter="Output"/>
    </GetSolutionProjects>

    <PropertyGroup>
      <Expression>(@(Projects->'%(ProjectName)', '|')).dll</Expression>
    </PropertyGroup>

    <XmlRead XmlFileName="$(MSBuildProjectFile)" XPath="//Project/ItemGroup/Reference/HintPath">
      <Output ItemName="FileReferences" TaskParameter="Value"/>
    </XmlRead>

    <RegexMatch Input="@(FileReferences)" Expression="$(Expression)">
      <Output TaskParameter="Output" ItemName ="ProjectReferences" />
    </RegexMatch>

    <Error Text="There must be no file references between solution projects, but it was found in '$(MSBuildProjectFile)' to the following file(s): %(ProjectReferences.Identity)"
           Condition="'%(ProjectReferences.Identity)' != ''" />
  </Target>
</Project>

Эта цель использует Задачи сообщества MSBuild , поэтому не забудьте добавить этот пакет NuGet ко всем вашим проектам (или Directory.Build.props).

0 голосов
/ 28 декабря 2018

Вы можете написать простой PowerShell

$path = "D:\temp\Solution1"
$extension = "csproj"


#-------------------

$projects = Get-ChildItem -Path $path -Recurse -Filter "*.$($extension)"

$projectsList = @()

# Create the project's solution list
foreach ($project in $projects)
{
    $projectsList += $project
}


foreach($project in $projectsList)
{   
    # Read the project xml
    [xml]$proj = [System.IO.File]::ReadAllText($project.FullName)

    # loop throught ItemGroup
    foreach($item in $proj.Project.ItemGroup)
    {

        # Looking for project reference
        $all = $projectsList | where {$_.Name -eq "$($item.Reference.Include).$($extension)"} 

        foreach($ref in $all)
        {
            Write-Warning "Find wrong reference for $($ref.Name) on $($project.Name)"
        }
    }

}
...