Tại sao không cần Maven trong .NET?


76

Tôi có ấn tượng rằng trong thế giới .NET, thực sự không cần một công cụ giống như Maven.

Tôi biết rằng có Byldan và NMaven (nó vẫn còn sống?), Nhưng tôi vẫn chưa thấy một dự án thế giới thực sử dụng chúng.

Ngoài ra, trong hầu hết các dự án .NET mà tôi đã làm việc, chưa bao giờ có ý kiến ​​cho rằng cần phải có một công cụ giống như Maven. Các vấn đề mà Maven maven đang giải quyết (giải quyết phụ thuộc tự động, cấu trúc xây dựng dựa trên quy ước ...) dường như không quá quan trọng trong .NET.

Nhận thức của tôi có đúng không?

Tại sao điều này là trường hợp?

Mọi người thực sự đang sử dụng gì trong .NET? Không có giải pháp phụ thuộc tự động nào cả?

Họ có đang viết các công cụ xây dựng của riêng họ không?

Có ai đang sử dụng chính Maven để quản lý các dự án .NET của họ không? Đây có phải là một lựa chọn tốt?

Kinh nghiệm của bạn là gì?


Microsoft đang học theo cách của Maven. Nếu bạn truy cập ASP.net 5 mới nhất, bạn sẽ tìm thấy những thứ tương tự ở đó. Thay vì XML tiết, tệp json được sử dụng có chỉ định phụ thuộc
Bargitta

1
@Bargitta: project.json hiện không được dùng nữa: xoofx.com/blog/2016/05/11/goodbye-project-json
Janus Troelsen

1
@JanusTroelsen họ đang đi ngược lại
Bargitta

Câu trả lời:


42

Đối với việc giải quyết sự phụ thuộc tạo tác, tôi muốn nói Nuget hiện là giải pháp thay thế ưa thích. Nó hỗ trợ và thúc đẩy độ phân giải thời gian xây dựng, tức là không cần phải kiểm tra các tạo tác phụ thuộc nhị phân vào vcs. Xem những bài báo này .

Từ phiên bản 2.7 của Nuget, độ phân giải thời gian xây dựng thậm chí còn được hỗ trợ tốt hơn với lệnh Nuget restore là một trong những tùy chọn.

Cập nhật: Hiện đã có một trình quản lý gói tương thích với nuget thay thế - Paket tốt hơn ứng dụng vani nuget trong việc xử lý các phụ thuộc tạm thời và hài hòa các phụ thuộc giữa các dự án trong cùng một giải pháp. Công cụ dường như cũng khá hoàn thiện (tích hợp VS và công cụ dòng lệnh cho CI)


3
Nuget là con đường để đi. Không nghi ngờ gì nữa.
BlueM

25

Maven đang được thúc đẩy bởi các dự án apache, vốn là một phần cốt lõi của cơ sở hạ tầng mã nguồn mở java khổng lồ . Việc áp dụng rộng rãi maven phải liên quan đến điều này, và mức độ trưởng thành (chất lượng) hiện tại cũng rất tốt.

Tôi không nghĩ thế giới mã nguồn mở .NET có bất kỳ tác nhân nguồn mở nào lớn đáng kể để thúc đẩy khái niệm như vậy thông qua. Bằng cách nào đó .NET dường như luôn đợi redmond cho những điều này.


49
Đó là bởi vì trong thế giới MS, nếu bạn xây dựng công cụ của riêng mình và nó tốt, rất có thể MS sẽ ra mắt một công cụ tương tự trong một hoặc hai năm và mọi người sẽ ngừng sử dụng công cụ của bạn. (Như Joel Spolsky đã nói, "nếu bạn quản lý để viết một cái gì đó có hiệu quả, bạn có thể thấy rằng bạn chỉ đang thực hiện nghiên cứu thị trường cho Microsoft.")
Nate CK

5
@ NateC-K, đó không phải là một điều tốt sao? một thế giới tàn nhẫn như vậy này. Nếu ms không làm những điều như vậy, có một giáo phái phàn nàn rằng nó không làm được, và khi ms thực sự thông qua các dự án có ý nghĩa thích hợp và bắt đầu nỗ lực và nguồn lực ngay cả khi đó bị chế giễu, đó cũng không phải là những gì cộng đồng cần, công cụ thích hợp đạt một đối tượng rộng hơn, với những điều hệ sinh thái dev sẽ phát triển chung
Srivathsa Harish Venkataramana

10
Nếu một dự án mã nguồn mở đã xây dựng một công cụ mà cộng đồng cần, thì không, việc MS xây dựng một công cụ tương đương để thay thế nó không phải là thứ cần thiết. Tệ nhất, đó là một nỗ lực trùng lặp không có mục đích rõ ràng nào khác ngoài việc đảm bảo rằng MS sở hữu mọi thứ. Điều thích hợp hơn là MS chỉ định một số nhà phát triển trả phí đóng góp cho dự án nguồn mở. Tuy nhiên, kể từ khi tôi đưa ra nhận xét trước đó, có vẻ như MS đã rất nỗ lực để chơi tốt hơn với cộng đồng nguồn mở, điều mà tôi đánh giá cao. Tôi hy vọng mối quan hệ đó sẽ tiếp tục được cải thiện trong những năm tới.
Nate CK

Mọi thứ chắc chắn đã thay đổi vào năm 2016 liên quan đến việc chờ đợi redmond cho những thứ này (xây dựng công cụ). Bây giờ chúng tôi có dotnet (lõi) trên linux và Nexus 3 hỗ trợ nuget. Một thế giới hoàn toàn mới.
Nico de Wet,

Tôi khá chắc chắn rằng họ không thường xây dựng lại các dự án mã nguồn mở, nhưng hỗ trợ và cải thiện chúng - giống như Json.Net. Avalonia là một ví dụ
gilmishal

23

Mặc dù câu hỏi cũ ở đây là suy nghĩ của tôi. Maven không chỉ đơn giản là một công cụ xây dựng, nó còn làm được nhiều điều hơn thế như quản lý kho lưu trữ, quản lý dự án, quản lý phụ thuộc, quản lý bản dựng, v.v.

Nhưng điểm hấp dẫn chính theo tôi là quản lý phụ thuộc. Địa ngục JAR là một vấn đề lớn ở Java Land ngay từ đầu và bạn cần một số công cụ để đối phó với nó. Trong thế giới .Net không có vấn đề như vậy (thực ra không có DLL hell đã được quảng cáo là một điểm thu hút lớn trong những ngày đầu của .Net) nên hầu hết mọi người đều ổn với MSBuild. Sau đó, do có rất nhiều thư viện của bên thứ ba, nên có những vấn đề về quản lý. Để thoát khỏi vấn đề này, giờ đây họ có Nuget.

Vì vậy, tóm lại, MsBuild + Nuget đủ tốt trong thế giới .Net cho hầu hết các dự án, Maven chỉ là quá mức cần thiết cho họ.


Tôi hoàn toàn đồng ý. Câu hỏi ban đầu có từ trước khi NuGet được giới thiệu.
jbandi

14

Tôi đồng ý với rất nhiều câu trả lời ở đây. .NET không có số lượng lớn các IDE độc lập, bạn đã sử dụng Visual Studio để viết mã, quản lý các phần phụ thuộc của mình, v.v. Giải pháp trong VS đủ tốt cho MSBuild nên đó là những gì bạn sử dụng từ các máy chủ xây dựng của mình.

Mặt khác, Java đã phát triển nhiều IDE và Java đi xuống một lộ trình quản lý các dự án bên ngoài từ IDE. Giải phóng nhà phát triển sử dụng IDE mà họ lựa chọn. Gần đây tôi đã bắt đầu đào tạo chéo từ C # sang Java và tôi có thể nói với bạn rằng khái niệm xây dựng maven khá xa lạ, nhưng sau một thời gian, tôi yêu thích nó, và quan trọng hơn là tôi thấy khái niệm repo mang lại cho tôi những gì.

Bây giờ cách VS được quản lý phụ thuộc yêu cầu bạn thêm tham chiếu dự án hoặc tham chiếu đến DLL. Việc thêm tham chiếu DLL này là thiếu sót. Bạn làm cách nào để quản lý sự thay đổi của các phiên bản, cách bạn cấu trúc các hình nền của bên thứ 3 tạo thành các nguồn bên ngoài và nội bộ cũng như các hình nền mà bạn muốn đưa vào từ nhóm của riêng mình nhưng không phải là tài liệu tham khảo dự án. Tôi đã thực hiện nhiều cách giải quyết nói chung dựa trên cấu trúc thư mục dựa trên tệp nhưng không có cách nào trong số đó là thanh lịch hoặc tuyệt vời khi các phiên bản thay đổi. Cũng làm cho việc phân nhánh trở nên khó khăn vì điều đó trở thành vấn đề cần cân nhắc trong cách bạn cấu trúc các thư mục.

Bây giờ tôi đã làm việc với Java và repo mavan công cộng, thật tuyệt. Tôi đã làm việc với Python và cài đặt pip hiệu quả một lần nữa được lấy từ các repo công khai. Cuối cùng tôi đã làm lại một số thứ trong C # với VS 2015 và việc tích hợp với Nuget chính xác là những gì còn thiếu.

Giờ đây, trong môi trường công ty, các repo công khai không phải lúc nào cũng có thể truy cập trực tiếp nên bạn cần các repo của công ty. Một lần nữa các hệ sinh thái không phải của Microsoft đang dẫn đầu về vấn đề này.

Về cơ bản, Java được phát triển từ một môi trường mã nguồn mở hơn, nơi bảo trì dự án IDE không được sử dụng trong khi .NET phát triển từ Visual Studio quản lý dự án và các đường dẫn khác nhau này có nghĩa là repo sau này sẽ xuất hiện trong Visual Studio.

Cuối cùng và đây là quan sát của tôi, cộng đồng Java có xu hướng sử dụng các framework của người khác nhiều hơn vì các thư viện cơ sở Java cung cấp ít hơn. Trong khi đó, người dùng .NET viết nhiều mã của riêng họ hơn. Cộng đồng java có một hệ sinh thái các mẫu và thực hành lớn hơn, trong khi .NET lại viết mã riêng hoặc chờ Microsoft. Điều này đang thay đổi nhưng một lần nữa cho thấy lý do tại sao .NET đi sau Java trong yêu cầu đối với repos.


1
Bạn đã thử Paket?
Janus Troelsen

Với lõi .net, chúng ta ngày nay có IDE người lái jetbrains. Tôi sẽ mong đợi nhiều hơn nữa.
John

6

Chúng tôi đang sử dụng NAnt vì không có giải pháp thay thế thực sự nào hoàn thiện hơn. Làm việc trên nhiều dự án cùng một lúc, chúng tôi đã tìm hiểu về việc có nhiều phiên bản thư viện và cách xử lý chúng. Đề xuất Maven thực sự hứa hẹn, nhưng chưa đủ trưởng thành để trở nên hữu ích trên nền tảng .NET.

Tôi nghĩ rằng nhu cầu ít rõ ràng hơn vì hầu hết các dự án .NET sử dụng Visual Studio, tự động đề xuất / thực thi cấu trúc thư mục, phụ thuộc, v.v. Đây là một 'giải pháp' gây hiểu lầm, vì việc phụ thuộc vào IDE cho các loại quy ước này sẽ hạn chế tính linh hoạt của nhóm phát triển và khóa bạn trong một giải pháp và nhà cung cấp cụ thể. Điều này rõ ràng không phải là trường hợp trong thế giới Java, do đó, nhu cầu rõ ràng về một công cụ giống như Maven.


Mặt khác, chúng tôi đã di chuyển từ NAnt sang MSBuild, vì quản lý tập lệnh NAnt theo cách thủ công là một vấn đề lớn. VS làm điều đó cho bạn. Tôi có một tệp dự án MSBuild chính được viết bằng tay trong trình soạn thảo xml để khởi chạy các bài kiểm tra đơn vị, v.v. và gọi một tệp msbuild khác (được tạo bởi VS) chỉ để xây dựng nguồn.
Ivan G.

Nhìn vào biểu đồ của cộng tác viên Github, có vẻ như NAnt đã đình trệ. Bạn vẫn sẽ giới thiệu nó chứ?
Janus Troelsen

1
@JanusTroelsen Tôi đã không làm việc trong .NET vài năm nay .. Tôi đã hỏi xung quanh và giải pháp thay thế được nghe nhiều nhất là các gói NuGet với Paket hoặc đơn giản là PowerShell.
Kamiel Wanrooij

2

Tôi không thích các công cụ xây dựng dựa trên XML.

Chúng tôi đã điều chỉnh rake ruby ​​để xây dựng các sản phẩm .net của mình. Albacore là một bộ tác vụ cào thực sự tuyệt vời để xây dựng các dự án .net.

Rake giúp bạn thực sự dễ dàng tạo các tập lệnh xây dựng thậm chí phức tạp và bạn đang xử lý mã thay vì hàng tấn dấu ngoặc nhọn.


Bạn vẫn đang sử dụng cái này? Tôi thấy rằng Albacore vẫn còn sống, với v2.6.0 vừa được phát hành.
Janus Troelsen

2

Tôi biết đây là một bài viết cũ nhưng khi tôi xem qua nó, tôi muốn chia sẻ một bài thay thế tuyệt vời khác.

Build Automation with PowerShell and Psake  

Rất nhiều người không tận dụng Psake (phát âm là sockey), điều thực sự thú vị là nó đang sử dụng msbuild.

Mặc dù đây không phải là câu trả lời cho câu hỏi maven (maven xuất phát từ nhu cầu xây dựng java dựa trên các tập lệnh ANT dài dòng tẻ nhạt).

Hầu hết mọi người không sử dụng bất kỳ CI nào (tích hợp liên tục) như Jenkins, Hudson, Cruise Control, TeamCity, TFS và cũng không sử dụng powershell.

PSake cho Powershell này sử dụng msbuild làm cho mọi thứ được điều khiển theo nhiệm vụ và rất có tổ chức. Đây là ví dụ liên kết http://www.shilony.net/2013/06/15/build-automation-with-powershell-and-psake/


1
Tôi thực sự thích psake cho các công cụ xây dựng. Để quản lý các phụ thuộc, tôi thực sự muốn có khả năng tạo các tệp package.config từ dòng nuget.command. Chẳng hạn như cách nó được thực hiện trong scriptcs.
8DH

Vâng, khi tôi bắt gặp psake, tôi bắt đầu kể cho mọi người nghe về nó.
Tom Stickel

Bạn vẫn sẽ giới thiệu Psake chứ?
Janus Troelsen

@JanusTroelsen Tôi không chắc. Có lẽ là không vì tôi đã không nghe ai nói về nó trong 3 năm qua.
Tom Stickel

"maven xuất phát từ nhu cầu xây dựng java dựa trên các tập lệnh ANT dài dòng tẻ nhạt" ???
Bless Geek

2

Chúng tôi sử dụng UppercuT. UppercuT sử dụng NAnt để xây dựng và nó là Khung xây dựng cực kỳ dễ sử dụng.

Xây dựng tự động dễ dàng như (1) tên giải pháp, (2) đường dẫn điều khiển nguồn, (3) tên công ty cho hầu hết các dự án!

https://github.com/chucknorris/uppercut/

Một số giải thích tốt ở đây: UppercuT

Thêm thông tin


UppercuT là một bản dựng tự động thông thường, có nghĩa là bạn thiết lập một tệp cấu hình và sau đó bạn nhận được một loạt các tính năng miễn phí. Có thể cho rằng tính năng mạnh mẽ nhất là khả năng chỉ định cài đặt môi trường ở MỘT nơi và áp dụng chúng ở mọi nơi, bao gồm cả tài liệu khi nó xây dựng nguồn.

Tài liệu có sẵn: https://github.com/chucknorris/uppercut/wiki

Đặc trưng :

  • Thiết lập đơn giản
  • Nâng cấp đơn giản
  • Các điểm mở rộng tùy chỉnh (trước, đăng và thay thế) cho từng bước của quy trình xây dựng http://uppercut.pbworks.com/CustomizeUsingExtensionPoints
  • Có tài liệu để tích hợp w / Team City, CruiseControl.NET và Jenkins (trước đây là Hudson) https://github.com/chucknorris/uppercut/tree/master/docs
  • Hoạt động trên Linux w / Mono
  • Tạo phiên bản DLL dựa trên số bản dựng và bản sửa đổi kiểm soát nguồn (SVN, TFS, Git, HG)
  • Biên dịch hoạt động - F5 hoặc Ctrl + Shift + B
  • Đặt tên mạnh dễ dàng như true / false
  • Kiểm tra và phân tích mã
    • Thử nghiệm
      • NUnit
      • MbUnit v2
      • Gallio
      • xUnit
    • NCover
    • NDepend
    • Nitriq
    • Máy phân tích di chuyển đơn
  • Sự xáo trộn
  • ILMerge
  • Tạo và tạo môi trường (ConfigBuilder, DocBuilder, SQLBuilder, DeploymentBuilder) https://github.com/chucknorris/uppercut/blob/master/docs/ConfigBuilder.doc?raw=true
  • Đóng gói đầu ra để chuẩn bị triển khai
  • Nén đầu ra

Điều gì làm cho nó dễ dàng như vậy? Nó có bất kỳ điểm bán hàng chính nào so với những điểm khác được đề cập để làm cho việc sử dụng này hấp dẫn hơn không?
Don Vince

Derick Bailey đã làm một roundup - lostechies.com/derickbailey/2010/05/10/...
ferventcoder

Điều làm cho nó dễ dàng là nó là một bản dựng thông thường. Bạn thiết lập cấu hình và sau đó chỉ cần chạy build.bat. Khi các tính năng mới được thêm vào uppercut, bạn có thể nâng cấp trong vòng vài giây.
ferventcoder

1
Hudson vẫn còn xung quanh, Oracle "sở hữu" nó, nhưng các nhà phát triển không thích cách Oracle vận hành mọi thứ và do đó họ đã tạo ra một cái tên quản gia khác có tên Jenkins và về cơ bản Jenkins đã được đón nhận và tỷ lệ chấp nhận nó khá ấn tượng.
Tom Stickel

Tôi thay đổi nội dung bài này để lưu ý rằng Uppercut bị bỏ rơi
Janus Troelsen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.