2015-05-04 12 views
22

Chúng tôi có dự án cơ sở dữ liệu trong Visual Studio 2013. Trong dự án này, chúng tôi có tệp .tt tạo tập lệnh .sql. Vấn đề là sau khi tạo, tác vụ xây dựng của tệp được tạo sẽ tự động được đặt thành Xây dựng. Nếu chúng ta thay đổi nó theo cách thủ công thành Không, nó sẽ được đặt lại thành Xây dựng sau khi tạo lại (chạy công cụ tùy chỉnh).Tệp được tạo (bởi T4) Build Action được đặt lại thành Build

Điều lạ lùng khác là nó chỉ xảy ra nếu tệp .tt nằm trong dự án cơ sở dữ liệu và trong một số thư mục của dự án đó (không phải trong thư mục gốc). nếu tệp .tt nằm trong một dự án khác (ở bất kỳ đâu) hoặc trong thư mục gốc của dự án cơ sở dữ liệu, hành động xây dựng của tệp được tạo ra không thay đổi sau khi tái tạo.

Chúng tôi không có bất kỳ trình bổ sung Visual Studio nào và tôi đã cố vô hiệu hóa tất cả các tiện ích và bản cập nhật có thể bị vô hiệu hóa.

Tôi sẽ cung cấp cho bạn bất kỳ chi tiết nào nếu cần.

+1

Bạn đã thêm [Biến đổi xây dựng] (https://msdn.microsoft.com/en-us/library/ee847423.aspx) vào tệp dự án chưa? Có bất kỳ tệp nào chỉ đọc không? – lloyd

+0

@ lloydm, Không có biến đổi nào về xây dựng trong tệp dự án. Một số tệp trong dự án chỉ đọc. – nightcoder

+0

Bạn đã xem xét các giải pháp được đăng để chạy [T4 trên mọi công trình] (http://stackoverflow.com/questions/1646580/get-visual-studio-to-run-a-t4-template-on-every -xây dựng)? – lloyd

Trả lời

1

Hành động xây dựng được lưu trữ như thế nào? Trong csproj Lưu ý: Biên dịch tập tin Class tạo với xây dựng hoạt động của Compile

Lưu ý: Biên dịch generatedFile.cs với một xây dựng hoạt động của Không

Vì vậy bây giờ để đặt nó vào Không.

Ok một mẫu T4 thay đổi sqlproj. Lưu ý: này được lưu một file mới cho sqlproj thay vì viết trên sqlproj hiện tại của bạn như bạn sẽ muốn ở mức tối thiểu:

  1. Sao lưu sqlproj bạn
  2. Thử nghiệm trên một tập tin mới
  3. Sửa đổi này để sao lưu sqlproj chỉ trong trường hợp.
  4. Có tên tệp cực kỳ độc đáo làm mục tiêu.
  5. Có điều này như một mẫu T4 riêng
  6. Run this sau khi công cụ tùy chỉnh của bạn

    <#@ template debug="true" hostSpecific="true" #> 
        <#@ output extension=".cs" #> 
        <#@ Assembly Name="System.Core" #> 
    
        <#@ import namespace="System" #> 
        <#@ import namespace="System.IO" #> 
        <#@ import namespace="System.Collections.Generic" #> 
    
        <# 
        string file = @"C:\...\MyProject.sqlproj"; 
    
    
    
         string [] lines = System.IO.File.ReadAllLines(file); 
    
    
         //relative path of file you want to change build action 
         string target = @"Models\GeneratedClass.cs"; 
         //find the line that has your class 
         for(int i = 0; i < lines.Length ; i++) 
         { 
    
          if(lines[i].Contains(target)) 
          { 
           //Replace Compile with None 
           lines[i].Replace("Compile", "None"); 
    
          } 
         } 
    
         string templateDirectory = Path.GetDirectoryName(Host.TemplateFile); 
         string outputFileName = "newCSProj.sqlproj"; 
         string outputFilePath = Path.Combine(templateDirectory, outputFileName); 
    
         File.WriteAllLines(outputFilePath, lines); 
    
        #> 
    

Đây là cảnh báo Visual Studio cho thấy trước khi chạy một Mẫu Văn bản

An ninh Cảnh báo: Chạy mẫu văn bản này có khả năng gây hại cho máy tính của bạn. Không chạy nó nếu bạn lấy nó từ một nguồn không đáng tin cậy.

+0

và có những cách tốt hơn để sửa đổi [tệp dự án] (http://blogs.msdn.com/b/msbuild/archive/2005/11/07/490068.aspx) – lloyd

1

Câu trả lời này đã được đề cập đến trong nhận xét, nhưng ai đó có thể bỏ lỡ nó. Đã thay đổi tiện ích đầu ra thành ví dụ: ".sqlscript" và Action Build mặc định sẽ là None.

<#@ output extension=".sqlscript" #> 

Bạn cũng có thể thay đổi biên tập mặc định cho phần mở rộng này để

"Microsoft SQL Server Data Tools, T-SQL Editor"

để bạn có thể đọc và chỉnh sửa nó như là tiêu chuẩn Kịch bản lệnh T-SQL.Chỉ cần truy cập

Công cụ -> Tùy chọn .. -> Trình chỉnh sửa văn bản -> Tiện ích mở rộng tệp.

Nó không giải quyết được sự cố với tệp ".sql", nhưng đó là cách giải quyết tốt và hoạt động tốt cho tôi. Tôi đã thử nghiệm nó trong VS2015 nhưng nó có thể hoạt động tương tự trong VS2013.

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