現在のプロジェクトで CodeSmith を使用しており、問題を解決しようとしています。私の CodeSmith プロジェクト (.csp) では、生成されたすべてのファイルを現在のプロジェクト (.csproj) に自動的に追加するオプションを選択できます。しかし、出力を複数のプロジェクト (.csproj) に追加できるようにしたいと考えています。これを許可する CodeSmith 内のオプションはありますか? または、プログラムでそれを行う良い方法はありますか?
ありがとう。
現在のプロジェクトで CodeSmith を使用しており、問題を解決しようとしています。私の CodeSmith プロジェクト (.csp) では、生成されたすべてのファイルを現在のプロジェクト (.csproj) に自動的に追加するオプションを選択できます。しかし、出力を複数のプロジェクト (.csproj) に追加できるようにしたいと考えています。これを許可する CodeSmith 内のオプションはありますか? または、プログラムでそれを行う良い方法はありますか?
ありがとう。
CodeSmithにこの問題を自動的に処理させる方法を見つけることができなかったため、これを処理するためにCodeBehindファイルにカスタムメソッドを作成することになりました。
いくつかの注意事項:-projファイルはXMLであるため、編集はかなり簡単ですが、プロジェクトに含まれるファイルのリストを保持する実際の「ItemGroup」ノードには、実際には特別な方法でラベルが付けられていません。「Contains」子ノードを持つ「ItemGroup」ノードを選択することになりましたが、どちらを使用するかを決定するためのより良い方法があるかもしれません。-各ファイルが作成/更新されるのではなく、すべてのプロジェクトファイルの変更を一度に行うことをお勧めします。そうしないと、Visual Studioから生成を起動すると、「このアイテムは変更されました。リロードしますか?」という洪水が発生する可能性があります。ファイルがソース管理下にある場合(そうですよね?!)、次のようになります。プロジェクトファイルの編集とともに、ファイルのチェックアウトとソース管理への追加を処理する必要があります。
プロジェクトにファイルを追加するために使用したコードは(多かれ少なかれ)次のとおりです。
/// <summary>
/// Adds the given file to the indicated project
/// </summary>
/// <param name="project">The path of the proj file</param>
/// <param name="projectSubDir">The subdirectory of the project that the
/// file is located in, otherwise an empty string if it is at the project root</param>
/// <param name="file">The name of the file to be added to the project</param>
/// <param name="parent">The name of the parent to group the file to, an
/// empty string if there is no parent file</param>
public static void AddFileToProject(string project, string projectSubDir,
string file, string parent)
{
XDocument proj = XDocument.Load(project);
XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003";
var itemGroup = proj.Descendants(ns + "ItemGroup").FirstOrDefault(x => x.Descendants(ns + "Compile").Count() > 0);
if (itemGroup == null)
throw new Exception(string.Format("Unable to find an ItemGroup to add the file {1} to the {0} project", project, file));
//If the file is already listed, don't bother adding it again
if(itemGroup.Descendants(ns + "Compile").Where(x=>x.Attribute("Include").Value.ToString() == file).Count() > 0)
return;
XElement item = new XElement(ns + "Compile",
new XAttribute("Include", Path.Combine(projectSubDir,file)));
//This is used to group files together, in this case the file that is
//regenerated is grouped as a dependent of the user-editable file that
//is not changed by the code generator
if (string.IsNullOrEmpty(parent) == false)
item.Add(new XElement(ns + "DependentUpon", parent));
itemGroup.Add(item);
proj.Save(project);
}
すべてのプロジェクトで参照できる共有アセンブリ (DLL) にコンパイルすることを考えたことはありますか?
これがあなたの要件に合わないかもしれないことはわかっていますが、これは、すべてのプロジェクトで使用できる単一のソースと、必要に応じて維持するコード ベースを 1 つだけにするための最良の方法の 1 つになると思います。