2012-09-17 34 views
12

Tôi có một tập tin thực thi đơn giản rằng tôi đang chạy từ một dòng lệnh DOS được sử dụng để xây dựng một ứng dụng nhỏ C# mà công bố một dự án ClickOnce. Một dòng là thế này:Specify công bố phiên bản với dòng lệnh MSBuild như phiên bản lắp ráp của dự án

msbuild MyApp.csproj /t:publish /property:PublishDir="deploy/" 

này hiện xuất bản ứng dụng, nhưng nó sử dụng Publish Version mà tôi thiết lập trong "Xuất bản" tab Visual Studio. Tôi hy vọng để có thể thiết lập các phiên bản phát hành tại cửa sổ dòng lệnh, và đặc biệt, tôi muốn sử dụng các Version hội của dự án. Một cái gì đó như:

msbuild MyApp.csproj /t:publish /property:PublishDir="deploy/" /property:PublishVersion="$(Proj.AssemblyVersion)" 

Tôi hy vọng sẽ làm mà không tạo tác vụ tùy chỉnh vì đây chỉ là giải pháp tạm thời và tôi sẽ thay thế nó bằng một hệ thống xây dựng thích hợp hơn sau này.

Ngoài ra, tôi đã xem xét cập nhật phiên bản tệp kê khai đã xuất bản bằng cách sử dụng -Update cờ, nhưng tôi không biết cách lấy số phiên bản lắp ráp từ dự án hoặc lắp ráp mà không sử dụng PowerShell hoặc một số chương trình cần được tải xuống. Nếu tôi có thể sử dụng một cái gì đó mà đi kèm với Visual Studio, mà sẽ làm việc là tốt.

+0

Câu trả lời cho [câu hỏi này] (http://stackoverflow.com/questions/1859328/setting-assemblyfileversion-with-msbuild-call) giúp gì? – adrianbanks

+0

@adrianbanks: Đó đặt phiên bản lắp ráp từ một số biến trong kịch bản hàng loạt. Tôi hy vọng sẽ thiết lập phiên bản triển khai từ phiên bản lắp ráp (nơi phiên bản lắp ráp được lưu trữ trong AssemblyInfo.cs cho dự án). –

Trả lời

10

Hãy thử này thêm vào file csproj của bạn. Mục tiêu sẽ lấy phiên bản từ lắp ráp đầu ra và cập nhật các ApplicationVersion trước khi Publish:

<Target Name="BeforePublish"> 
    <GetAssemblyIdentity AssemblyFiles="$(TargetPath)"> 
    <Output TaskParameter="Assemblies" ItemName="fooAssemblyInfo"/> 
    </GetAssemblyIdentity> 
    <PropertyGroup> 
    <ApplicationVersion>%(fooAssemblyInfo.Version)</ApplicationVersion> 
    </PropertyGroup> 
</Target> 

Có lẽ một cách đẹp hơn để tự động lấy tên lắp ráp nhưng đối với mục đích của bạn cần làm các trick.

tín dụng đối với câu trả lời này cho cú pháp GetAssemblyIdentity: https://stackoverflow.com/a/443364/266882

Người hỏi Chỉnh sửa:

Xem bình luận dưới đây để cập nhật.

+0

Tôi cuối cùng đã đi với một giải pháp (thay đổi các quy tắc một chút), nhưng điều này xuất hiện như nó sẽ làm việc nếu cách của tôi không pan ra. Cảm ơn! –

+0

tôi trở lại này, và nó đã không làm việc chính xác như tôi mong đợi. Hy vọng của tôi là có phiên bản triển khai được xác định trong tệp kê khai triển khai được tạo. Tuy nhiên, điều này được tạo trước khi xuất bản.Thực hiện một bước tương tự như được hiển thị trên BeforeBuld sẽ hoạt động, nhưng hội đồng không có sẵn sau đó. Cách giải quyết của tôi là chuyển vào phiên bản để msbuild trên dòng lệnh và sử dụng nó trong tác vụ BeforeBuild. –

+1

bin \ $ (Cấu hình) \ WpfApplication1.exe có thể được thay thế bằng $ (TargetPath) –

8
msbuild xxx.csproj /target:clean;publish /property:ApplicationVersion=1.2.3.4 
+0

Nếu sử dụng VSTS bạn có thể sử dụng '/property:ApplicationVersion=1.0.0. $ (Build.SourceVersion)' để có được ID thay đổi/commit được tự động nối thêm. Tất nhiên bạn vẫn có thể làm phiên bản chính ở đây nếu bạn muốn, nhưng nó có nghĩa là một bản xây dựng mới sẽ luôn luôn có một phiên bản mới và bạn luôn có thể theo dõi trở lại phiên bản nguồn. –

+0

Điều đó thật tuyệt vời - trong 7 năm qua tôi đã tự động tự tăng thêm –

9

Để cập nhật một cách chính xác phiên bản khai báo trong việc triển khai biểu hiện bạn cần phải sửa đổi ApplicationVersion tại "AfterCompile" bước chứ không phải là "BeforePublish" bước, kể từ khi biểu hiện ứng dụng được tạo ra tại thời gian xây dựng. Nhưng sau đó bạn không thể dựa vào thuộc tính $ (TargetPath) để trỏ đến hội đồng và thay vào đó sử dụng đường dẫn sau: $ (ProjectDir) obj \ $ (ConfigurationName) \ $ (TargetFileName)

Vì vậy, đây là cập nhật Đoạn mã đích mà bạn có thể thêm vào tệp .csproj:

<Target Name="AfterCompile"> 
    <GetAssemblyIdentity AssemblyFiles="$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)"> 
    <Output TaskParameter="Assemblies" ItemName="AssemblyInfo" /> 
    </GetAssemblyIdentity> 
    <PropertyGroup> 
    <ApplicationVersion>%(AssemblyInfo.Version)</ApplicationVersion> 
    </PropertyGroup> 
</Target> 
Các vấn đề liên quan