Сообщить об ошибке / предупреждении, если отсутствуют файлы в проекте / решении в Visual Studio - PullRequest
11 голосов
/ 30 июня 2010

Есть ли способ для Visual Studio сообщать об ошибке / предупреждении при создании решения, в котором отсутствуют файлы (желтый треугольник с восклицательным знаком), которые обязательно вызывают ошибку компиляции?Как отсутствующий файл конфигурации, который читается во время выполнения.

Спасибо

Ответы [ 4 ]

11 голосов
/ 10 сентября 2011

Вам необходимо определить макрос EnvironmentEvents .Общее описание того, как это сделать, см. Здесь: Настройка процесса сборки проекта .

А вот код, который можно напрямую вставить в макросреду для проверки отсутствующих файлов:

Private Sub BuildEvents_OnBuildBegin(ByVal Scope As EnvDTE.vsBuildScope, ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildBegin
    For Each proj As Project In DTE.Solution.Projects
        For Each item As ProjectItem In proj.ProjectItems
            If (item.Kind <> "{6BB5F8EE-4483-11D3-8BCF-00C04F8EC28C}") Then ' only check physical file items
                Continue For
            End If

            For i As Integer = 1 To item.FileCount
                Dim path As String = item.FileNames(i)
                If Not System.IO.File.Exists(item.FileNames(i)) Then
                    WriteToBuildWindow("!! Missing file:" & item.FileNames(i) + " in project " + proj.Name)
                End If
            Next
        Next
    Next
End Sub

Public Sub WriteToBuildWindow(ByVal text As String)
    Dim ow As OutputWindow = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput).Object
    Dim build As OutputWindowPane = ow.OutputWindowPanes.Item("Build")
    build.OutputString(text & Environment.NewLine)
End Sub

Он отобразит текст «отсутствующий файл» непосредственно в окне вывода «Сборка» Visual Studio.Это должно быть довольно легко понять и настроить в соответствии с вашими потребностями.Например, вы можете добавить ошибки в вывод ошибок.

3 голосов
/ 11 октября 2012

Когда у нас отсутствовали файлы, у нас возникали сумасшедшие ошибки компиляции, например, невозможность записи xyz.pdb, даже если файл заканчивал записываться. Я взял то, что предоставил Саймон (спасибо!), И немного перевернул его; в частности, я добавил немного рекурсии и добавил поддержку папок и файлов с вложенными файлами (например, наборы данных, кодовые фрагменты).

Private Sub BuildEvents_OnBuildBegin(ByVal Scope As EnvDTE.vsBuildScope, ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildBegin

    For Each proj As Project In DTE.Solution.Projects
        walkTree(proj.ProjectItems, False)
    Next

End Sub

Private Sub walkTree(ByVal list As ProjectItems, ByVal showAll As Boolean)

    For Each item As ProjectItem In list

        ' from http://msdn.microsoft.com/en-us/library/z4bcch80(v=vs.80).aspx
        ' physical files:   {6BB5F8EE-4483-11D3-8BCF-00C04F8EC28C}
        ' physical folders: {6BB5F8EF-4483-11D3-8BCF-00C04F8EC28C}

        If (item.Kind = "{6BB5F8EE-4483-11D3-8BCF-00C04F8EC28C}" OrElse _
            item.Kind = "{6BB5F8EF-4483-11D3-8BCF-00C04F8EC28C}") Then

            For i As Integer = 1 To item.FileCount ' appears to be 1 all the time...

                Dim existsOrIsFolder As Boolean = (item.Kind = "{6BB5F8EF-4483-11D3-8BCF-00C04F8EC28C}" OrElse System.IO.File.Exists(item.FileNames(i)))

                If (showAll OrElse _
                    existsOrIsFolder = False) Then

                    WriteToBuildWindow(String.Format("{0}, {1}, {2} ", existsOrIsFolder, item.ContainingProject.Name, item.FileNames(i)))

                End If

            Next

            If (item.ProjectItems.Count > 0) Then
                walkTree(item.ProjectItems, showAll)
            End If

        End If

    Next

End Sub

Private Sub WriteToBuildWindow(ByVal text As String)
    Dim ow As OutputWindow = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput).Object
    Dim build As OutputWindowPane = ow.OutputWindowPanes.Item("Build")
    build.OutputString(text & Environment.NewLine)
End Sub
2 голосов
/ 20 ноября 2015

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

0 голосов
/ 23 октября 2015

Если у вас есть среда, похожая на linux, с доступом к папке проекта (например, если вы используете git для контроля версий, вы можете использовать для этого Git Bash или Cygwin), вот мой очень быстрый и грязный путь:

grep '<Content Include="' "project_file.csproj" | sed 's/^.*"\([^"]*\)".*/\1/' | sed 's/\\/\//g' | xargs -d'\n' ls > /dev/null

(Как это работает: я пытаюсь ls каждый файл, указанный в проекте, и отправляю вывод stdout команды ls на /dev/null, поэтому он будет скрыт. Если какие-либо файлы не существуют, ls подставит их имена в stderr, а не в stdout, поэтому они будут видны.)

Обратите внимание, что это не понимает выходов в кодировке URL, поэтому вы получите несколько ложных срабатываний, если ваш проект содержит имена файлов с символами вроде '(' в них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...