マージなどの問題のため、フォルダー内にあるすべてのソースコードファイルを含まないプロジェクトファイルがたくさんあります。
小さなツールを書く前に、すべての*.cs
ファイルはプロジェクトファイルに含まれています。他の誰もこれを行っていないことを確認したいと思います。
(100近いプロジェクトファイルと、数千のC#ファイルがあります)
プロジェクトの特定のディレクトリにあるすべての「* .cs」ファイルを含めるためにワイルドカードを使用するためにVisual Studioが現在サポートしていることは、この問題に対する最善の解決策です。そのため、「。cs」ファイルが追加されたときにプロジェクトファイルを更新する必要はなく、名前が変更されました。ただし、これがUIから使用可能になるのはVS2017のみです。
その数のファイルとプロジェクトを使用すると、より自動化された何かが必要なように思えます。ただし、手動のアプローチがあります(既に認識しているかどうかはわかりません):
「 不足しているファイルを表示 」Visual Studio拡張機能が見つかりました。ビルド後、「エラーリスト」ウィンドウに見つからないファイルのリストが表示されます。
スタックオーバーフローに関するこの一般的な解決策は読んでいないので、この週末にこの問題を解決するためにNodeJSモジュールを作成しました。
https://www.npmjs.com/package/check-vs-includes
これはかなり一般的なものなので、他の人にも役立つことを願っています。デプロイするたびに、70を超えるフォルダー(500以上のファイル)を手動でチェックする必要がありません。時間があれば、ドキュメントのような改善を望んでいます...しかし、今すぐ簡単な例を挙げましょう。
簡単な例
npm install check-vs-includes
たとえば、gulpfile.js
プロジェクトへ:
gulp.task('checkVSIncludes', function(cb) {
checkVSIncludes(['/Content/**/*.less', '/app/**/*.js']);
});
この例では、すべての.js
および.less
指定されたフォルダー内のファイルは、プロジェクトファイルに含まれます。 glob を使用できることに注意してください。
gulp checkVSIncludes
ソースコードでその他のオプションを確認してください。すべて GitHub にあります(投稿は大歓迎です;))。
この解決策を探して、 this VS Extensionに遭遇しましたが、VS 2012でのみ動作します。 Github にもあります。
VS 2013+では、 this ブログ投稿にあるPowershellスクリプトを使用します。 C#プロジェクトでのみ機能することに注意してください。ただし、VBプロジェクトの場合は変更できます。
#Author: Tomasz Subik http://tsubik.com
#Date: 8/04/2012 7:35:55 PM
#Script: FindProjectMissingFiles
#Description: Looking for missing references to files in project config file
Param(
[parameter(Mandatory=$false)]
[alias("d")]
$Directory,
[parameter(Mandatory=$false)]
[alias("s")]
$SolutionFile
)
Function LookForProjectFile([System.IO.DirectoryInfo] $dir){
[System.IO.FileInfo] $projectFile = $dir.GetFiles() | Where { $_.FullName.EndsWith(".csproj") } | Select -First 1
if ($projectFile){
$projectXmlDoc = [xml][system.io.file]::ReadAllText($projectFile.FullName)
#[xml]$projectXmlDoc = Get-Content $projectFile.FullName
$currentProjectPath = $projectFile.DirectoryName+"\"
Write-Host "----Project found: " $projectFile.Name
$nm = New-Object -TypeName System.Xml.XmlNamespaceManager -ArgumentList $projectXmlDoc.NameTable
$nm.AddNamespace('x', 'http://schemas.Microsoft.com/developer/msbuild/2003')
[System.Collections.ArrayList]$filesListedInProjectFile = $projectXmlDoc.SelectNodes('/x:Project/x:ItemGroup/*[self::x:Compile or self::x:Content or self::x:None]/@Include', $nm) | Select-Object Value
CheckProjectIntegrity $dir $currentProjectPath $filesListedInProjectFile;
}
else { $dir.GetDirectories() | ForEach-Object { LookForProjectFile($_); } }
}
Function CheckProjectIntegrity([System.IO.DirectoryInfo] $dir,[string] $currentProjectPath, [System.Collections.ArrayList] $filesListedInProjectFile ){
$relativeDir = $dir.FullName -replace [regex]::Escape($currentProjectPath)
$relativeDir = $relativeDir +"\"
#check if folder is bin obj or something
if ($relativeDir -match '(bin\\|obj\\).*') { return }
$dir.GetFiles() | ForEach-Object {
$relativeProjectFile = $_.FullName -replace [regex]::Escape($currentProjectPath)
$match = $false
if(DoWeHaveToLookUpForThisFile($relativeProjectFile))
{
$idx = 0
foreach($file in $filesListedInProjectFile)
{
if($relativeProjectFile.ToLower().Trim() -eq $file.Value.ToLower().Trim()){
$match = $true
break
}
$idx++
}
if (-not($match))
{
Write-Host "Missing file reference: " $relativeProjectFile -ForegroundColor Red
}
else
{
$filesListedInProjectFile.RemoveAt($idx)
}
}
}
#lookup in sub directories
$dir.GetDirectories() | ForEach-Object { CheckProjectIntegrity $_ $currentProjectPath $filesListedInProjectFile }
}
Function DoWeHaveToLookUpForThisFile($filename)
{
#check file extensions
if ($filename -match '^.*\.(user|csproj|aps|pch|vspscc|vssscc|ncb|suo|tlb|tlh|bak|log|lib|sdf)$') { return $false }
return $true
}
Write-Host '######## Checking for missing references to files started ##############'
if($SolutionFile){
[System.IO.FileInfo] $file = [System.IO.FileInfo] $SolutionFile
$Directory = $file.Directory
}
LookForProjectFile($Directory)
Write-Host '######## Checking for missing references to files ends ##############'
使用例(NuGetコンソールから実行する必要があります):
./FindProjectMissingFiles.ps1 -s $dte.Solution.FileName
特定のルートフォルダーにあるプロジェクトファイルから参照されたすべてのcsファイルを(再帰的に)検索し、同じルートフォルダーにあるファイルシステム内のファイルと比較する小さなC#コンソールアプリケーション。さまざまなファイル拡張子、さまざまなプロジェクトファイル構造に適用できます(VS2008でテスト済みです)。他のニーズに合わせて変更が必要になる場合がありますが、有用な基盤を提供する必要があります。
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
namespace CompareProjectFilesWithFileSystem
{
class Program
{
static void Main(string[] args)
{
string ext = "cs";
string rootProjectFolder = @"C:\MySolutionRootFolder";
Regex projectFileReferenceRegEx = new Regex(@"<(Compile|Content|None) Include=\""([^\""]+." + ext + @")\""( /)?>");
// Files in file system:
List<string> filesInFileSystem = new List<string>();
filesInFileSystem.AddRange(Directory.GetFiles(rootProjectFolder, "*." + ext, SearchOption.AllDirectories));
// Files referred from project files:
string[] projectFilePaths = Directory.GetFiles(rootProjectFolder, "*.csproj", SearchOption.AllDirectories);
List<string> filesReferredInProjectFiles = new List<string>();
foreach (string projectFilePath in projectFilePaths)
{
string[] lines = File.ReadAllLines(projectFilePath);
foreach (string line in lines)
{
Match match = projectFileReferenceRegEx.Match(line);
if (match.Success)
{
filesReferredInProjectFiles.Add(Path.Combine(Path.GetDirectoryName(projectFilePath), match.Result("$2")));
}
}
}
// Finding files referred from project files that are not contained in file system. And reversely.
var list1 = filesReferredInProjectFiles.Except(filesInFileSystem).ToList();
var list2 = filesInFileSystem.Except(filesReferredInProjectFiles).ToList();
}
}
}
ファイルを追加しようとしたプロジェクトは「Webサイトプロジェクト」(WSP)であったため、以前のソリューションはどれも役に立ちませんでした。ソリューションエクスプローラーでプロジェクトを選択すると、[プロジェクト]メニュー項目が[Webサイト]に変換され、[すべてのファイルを表示]オプションがありませんでした。
これは、WSP( link )の場合です:
「すべてのファイルは既にソリューションエクスプローラーに表示されています。」
私の場合を除き、そうではありませんでした... Visual Studio 2015(VS)を閉じてから再度開き、プロジェクトをリロードするだけで問題を解決しました。 VSは、Webサイトがリロードされたときにのみ新しいファイルの追加を検出し、VSの外部でそれらのファイルが追加されたときは検出しないと思います。
別の可能性:ファイルがソース管理に選択的に追加されない場合があります。これを解決するには、プロジェクトを右クリックし、「フォルダーにアイテムを追加」を選択します。
ソースフォルダーに表示されるソース管理エクスプローラーに表示されないファイルはすべてここにあり、選択して追加できます。
(Team Foundation Serverがソース管理であると仮定):ファイルがプロジェクトに追加され、ソース管理エクスプローラーに表示されるが、ソリューションエクスプローラーに表示されない場合は、「追加」、「既存のアイテム」。これは、わずらわしいVisual Studio/TFSのバグであり、2時間かけて把握しようとしています。
同様の状況で、ファイルが見つからないためにコンパイルが失敗しました。以下にリンクされているこの投稿に出会ったので、助かりました。ビルドの開始時に実行されるVisual Studioマクロの記述について説明します。
しばらく前にこのためのツールを書きました。利用可能 ここ 。