2013-01-17 34 views
11

Tôi làm cách nào để thêm tệp mới vào .csproj từ dấu nhắc lệnh?Làm cách nào để thêm tệp mới vào tệp .csproj mà không cần studio trực quan

+4

Bạn có thể chỉnh sửa csproj với một trình soạn thảo văn bản. –

+1

Và tại sao bạn muốn làm một điều như vậy? Mục tiêu là gì? –

+1

Đây là một câu hỏi thực sự, tôi không đồng ý rằng nó cần phải được đóng lại. –

Trả lời

0

Dỡ bỏ dự án bằng cách nhấp chuột phải vào dự án trong trình khám phá giải pháp. Chỉnh sửa dự án bằng cách nhấp chuột phải. Thêm f.ex:

<Compile Include="Properties\AssemblyInfo.cs" /> 
0

.csproj tệp có thể được sử dụng làm đầu vào vào công cụ dòng lệnh MSBuild.

Xem tài liệu tham khảo MSBuild:

MS Build Reference

Và ví dụ, câu hỏi này.

MSBuild — Use the .csproj file or roll your own?

Bạn chỉ có thể sử dụng một trình soạn thảo văn bản để chỉnh sửa chúng và làm bất cứ điều gì MSBuild cho phép. Nếu bạn chèn hành động xây dựng tùy chỉnh Visual Studio có thể cảnh báo một nhà phát triển khi dự án được tải rằng nó chứa hành động tùy chỉnh, tùy thuộc vào những gì bạn làm.

4

Tôi không nghĩ rằng có bất kỳ công cụ nào sẽ phản hồi lệnh "thêm dự án" trên dòng lệnh để thực hiện việc này, nhưng tôi nghĩ bạn có thể may mắn khi tạo một chương trình/tập lệnh để thao tác nội dung XML csproj tập tin trực tiếp.

Cấu trúc của một tập tin csproj trông như thế này:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="..."> 
    <PropertyGroup> 
     <!-- Properties which affect the build process --> 
    </PropertyGroup> 
    <ItemGroup> 
     <!-- Groups of items to process --> 
    </ItemGroup> 
</Project> 

Để thêm một mã tập tin C# để một dự án, bạn chỉ cần thêm một yếu tố Compile đến một yếu tố ItemGroup:

<Compile Include="{relative path to file}" /> 

Nếu bạn sử dụng tệp dự án hiện có làm mẫu, điều này có thể thực hiện được bằng XSLT rất đơn giản.

1

Đây là cách dễ dàng để bạn có thể thực hiện việc này bằng cách sử dụng Linq2Xml. Tôi đã đưa vào một phương thức dựa trên danh sách và một danh sách. Oh, và giống như Casper nói: bạn sẽ cần phải dỡ bỏ dự án từ VS trước khi chương trình của bạn có thể chỉnh sửa nó. Sau đó, chỉ cần tải lại khi hoàn tất.

private static void AddFilesToUnitTestProject(FileInfo[] files, string measureBaseDirPath, string measureDataDirSuffix) 
    { 
     var unitTestProjectPath = measureBaseDirPath + _unitTestProjectFile; 
     var unitTestProjectFile = XDocument.Load(unitTestProjectPath); 
     var itemGroup = unitTestProjectFile.Nodes() 
          .OfType<XElement>() 
          .DescendantNodes() 
          .OfType<XElement>().First(xy => xy.Name.LocalName == "ItemGroup"); 

     foreach (var fileInfo in files) 
     { 
      var xelem = AddProjectContent(measureDataDirSuffix + fileInfo.Name, unitTestProjectFile); 
      itemGroup.Add(xelem); 
     } 
     unitTestProjectFile.Save(unitTestProjectPath); 
    } 

    private static void AddFileToUnitTestProject(string pathToAdd, string measureBaseDirPath, string measureDataDir) 
    { 
     var unitTestProjectPath = measureBaseDirPath + _unitTestProjectFile; 
     var unitTestProjectFile = XDocument.Load(unitTestProjectPath); 
     var itemGroup = 
     unitTestProjectFile.Nodes() 
          .OfType<XElement>() 
          .DescendantNodes() 
          .OfType<XElement>().First(xy => xy.Name.LocalName == "ItemGroup"); 
     var xelem = AddProjectContent(pathToAdd, unitTestProjectFile); 
     itemGroup.Add(xelem); 
     unitTestProjectFile.Save(unitTestProjectPath); 
    } 

private static XElement AddProjectContent(string pathToAdd, XDocument doc) 
{ 
    XNamespace rootNamespace = doc.Root.Name.NamespaceName; 
    var xelem = new XElement(rootNamespace + "Content"); 
    xelem.Add(new XAttribute("Include", pathToAdd)); 
    xelem.Add(new XElement(rootNamespace + "CopyToOutputDirectory", "Always")); 
    return xelem; 
} 
  • cập nhật với phương pháp AddProjectContent
+0

Bạn có thể vui lòng cung cấp mã cho AddProjectContent không vì câu trả lời của bạn sẽ khắc phục được sự cố của tôi .. –

+1

Chắc chắn không có vấn đề gì. Ở đây ya go: private static XElement AddProjectContent (chuỗi pathToAdd, XDocument doc) { XNamespace rootNamespace = doc.Root.Name.NamespaceName; var xelem = XElement mới (rootNamespace + "Nội dung"); xelem.Add (thuộc tính XAttribute mới ("Bao gồm", pathToAdd)); xelem.Add (mới XElement (rootNamespace + "CopyToOutputDirectory", "Always")); trả lại xelem; } –

Các vấn đề liên quan