Tricks 4 Designing & Developing All Kinds of Programs with C# Programming Language & .NET Framework & Dependencies
پیام خطایی که دریافت کردهاید، به این معنی است که NuGet تلاش میکند تا از یک منبع HTTP برای دانلود بستهها استفاده کند، در حالی که برای افزایش امنیت، استفاده از پروتکل HTTPS الزامی شده است. برای رفع این مشکل، باید اتصال امن (HTTPS) را در فایل NuGet.Config خود فعال کنید.
( NuGet package restore failed. Please see Error List window for detailed warnings and errors. Error occurred while restoring NuGet packages: The operation failed as details for project Application could not be loaded. )
نکته : اگر از مسیری استفاده میکنید که از امن بودن آن مطمئن هستید حتما باید این attribute را استفاده کنید. allowInsecureConnections="true"
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<!-- <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" /> -->
<!-- <add key="Microsoft Visual Studio Offline Packages" value="C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\" /> -->
<add key="PackFeed" value="http://nexus.morsa.local:8081/repository/nuget.org-proxy/index.json" allowInsecureConnections="true" />
</packageSources>
<disabledPackageSources>
<add key="Microsoft Visual Studio Offline Packages" value="true" />
<add key="nuget.org" value="true" />
</disabledPackageSources>
<packageRestore>
<add key="enabled" value="True" />
<add key="automatic" value="True" />
<add key="PackFeed" value="True" />
</packageRestore>
<bindingRedirects>
<add key="skip" value="False" />
</bindingRedirects>
</configuration>C:\Users\{UserName}\AppData\Roaming\NuGet
لینک دستورات کانفیگ NuGet وبسایت ماکروسافت
Microsoft.AspNetCore.Mvc.NewtonsoftJson
builder.Services.AddControllers().AddNewtonsoftJson();و در ورودی Controller به این شکل اطلاعات دریافت می کنیم:
[HttpPatch("{userId}")]
public IActionResult PatchData(string userId, JsonPatchDocument<UpdateUserDataMo> model, CancellationToken cancellation)
{
var user = await GetUserByIdAsync(userId, cancellation);
// some codes
model.ApplyTo(user, ModelState);
return Ok($"کاربر با آیدی: {userId} بروز رسانی شد.");
}public async Task<UpdateUserResult> PatchUserAync(string userId, JsonPatchDocument<UpdateUserDataMo> model, CancellationToken cancellation)
{
try
{
var user = await GetUserByIdAsync(userId, cancellation);
if (user is null) return UpdateUserResult.NotFound;
if (user.IsRemoved || !user.PhoneNumberConfirmed) return UpdateUserResult.NotAccess;
//UpdateUserDataMo data = new()
//{
// FirstNameFa = user.FirstNameFa?.SanitizeText(),
// LastNameFa = user.LastNameFa?.SanitizeText()
//};
//model.ApplyTo(data);
user.LastUpdateTime = DateTime.Now;
await userRepository.UpdateUserAsync(user.Id, cancellation);
return UpdateUserResult.Success;
}
catch (Exception ex)
{
throw new Exception($"کاربر با آیدی: {userId} بروز رسانی نشد.", ex);
//return UpdateUserResult.Error;
}
}error: open(".vs/ProjectOrSolutionName/FileContentIndex/2b3c3599-****-****-****-285080df9374.vsidx"): Permission denied
یــــــــــــــــا
error: unable to index file '.vs/ProjectOrSolutionName/FileContentIndex/2b3c3599-****-****-****-285080df9374.vsidx'
icacls .vs/ProjectOrSolutionName/FileContentIndex/77641f5e-****-****-****-e97400316658.vsidx /grant "YourUserName":Fwhoamiنسخه بندی در توسعه نرم افزار، یک سیستم سازماندهی بسیار مهم است که به ما کمک میکند تا تغییرات ایجاد شده در طول زمان را پیگیری کرده و نرم افزارهایمان را بهتر مدیریت کنیم.
| توضیحات | ----- |
|---|---|
| اولین عدد (10) نشاندهنده تغییرات اساسی در نرم افزار است. این تغییرات ممکن است شامل تغییر در معماری، APIها، یا ویژگیهای اصلی باشد که ممکن است با نسخههای قبلی ناسازگار باشد. | Major (اصلی) |
| عدد دوم (19) نشاندهنده افزودن ویژگیهای جدید یا تغییرات قابل توجهی است که با نسخههای قبلی سازگار هستند. | Minor (فرعی) |
| عدد سوم (01) نشاندهنده رفع باگها و مشکلات جزئی در نرم افزار است. این تغییرات معمولاً با نسخههای قبلی سازگار هستند. | Patch (پچ) |
روشنایی و سادگی: این ساختار به توسعهدهندگان و کاربران این امکان را میدهد تا به سرعت متوجه شوند که یک نسخه جدید چه تغییراتی داشته است.
مدیریت وابستگیها: با استفاده از این ساختار، میتوان به راحتی وابستگیهای بین نرم افزارهای مختلف را مدیریت کرد.
سازگاری: با دانستن اینکه کدام تغییرات اساسی و کدام تغییرات جزئی هستند، میتوان به راحتی مشخص کرد که یک نسخه جدید با نسخههای قبلی سازگار است یا خیر.
1.0.0: اولین نسخه پایدار یک نرم افزار.
2.3.5: نسخه دوم نرم افزار که سه ویژگی جدید به آن اضافه شده و پنج باگ در آن رفع شده است.
ثبات: سعی کنید یک سیستم نسخه بندی ثابت را برای پروژه خود انتخاب کنید و به آن پایبند باشید.
معنیدار بودن اعداد: هر عدد باید معنای مشخصی داشته باشد و تغییرات را به درستی نشان دهد.
استفاده از ابزارهای خودکار: برای مدیریت نسخهها و ایجاد تگهای مناسب، از ابزارهای خودکار مانند Git استفاده کنید.
با توجه به اعداد استفاده شده در این نسخه، میتوانیم نتیجه بگیریم که:
نرم افزار تغییرات اساسی زیادی را از زمان نسخه 1.0.0 تجربه کرده است. در نسخه 19، ویژگیهای جدید قابل توجهی به نرم افزار اضافه شده است. در نسخه 01، برخی از باگها و مشکلات جزئی نرم افزار رفع شده است.
موضوعات مرتبطی که ممکن است برای شما مفید باشد:
Semantic Versioning: یک استاندارد رسمی برای نسخه بندی نرم افزار است.
Git Tagging: نحوه ایجاد تگ برای نسخههای مختلف در Git.
Version Control Systems:سیستمهای کنترل نسخه مانند Git و SVN.
آزمایش و توسعه با NGINX از فایلهای HTML خود در مسیر C:\nginx\html استفاده کنید. از NGINX برای Reverse Proxy یا Load Balancer در پروژههای توسعه خود بهره ببرید.
اجرای NGINX
باز کردن Command Prompt یا PowerShell:
کلیدهای Win + R را فشار دهید، cmd یا powershell را تایپ کنید و Enter را بزنید.
به مسیر nginx.exe بروید:
cd C:\nginxبا دستور زیر NGINX را اجرا کنید:
start nginxپس از اجرا، NGINX به طور پیشفرض روی پورت 80 اجرا میشود. برای بررسی، مرورگر خود را باز کنید و به آدرس زیر بروید:
http://localhostشما باید صفحه پیشفرض NGINX را مشاهده کنید.
فایل تنظیمات اصلی NGINX در مسیر C:\nginx\conf\nginx.conf قرار دارد. برای ویرایش تنظیمات:
فایل را با یک ویرایشگر متن مانند Notepad یا VS Code باز کنید.
worker_processes 1;
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
}
تغییرات دلخواه خود را اعمال کنید (مانند تنظیم پورت یا مسیر فایلهای استاتیک).
برای اعمال تغییرات، NGINX را ریاستارت کنید:
nginx -s reloadپورت 80 در دسترس نیست: اگر پورت 80 قبلاً توسط سرویس دیگری استفاده میشود (مثل IIS):
فایل nginx.conf را باز کنید و پورت دیگری (مثلاً 8080) را تنظیم کنید:
listen 8080;پس از تغییر، NGINX را ریاستارت کنید:
nginx -s reloadاگر NGINX کار نمیکند: برای بررسی خطاها، فایل لاگها را بررسی کنید:
C:\nginx\logs\error.logبرای متوقف کردن کامل NGINX: این دستور بلافاصله NGINX را متوقف میکند.
nginx -s stopو برای توقف آرام: این دستور تمام درخواستهای فعلی را تکمیل کرده و سپس NGINX را متوقف میکند.
nginx -s quitو یا حتی میتونید از این روش استفاده کنید:
باز کردن Task Manager:
کلیدهای Ctrl + Shift + Esc را فشار دهید یا روی نوار وظیفه راستکلیک کرده و Task Manager را باز کنید.
پیدا کردن فرآیند NGINX:
به تب Processes بروید و فرآیندهای nginx.exe را پیدا کنید.
پایان دادن به فرآیند:
روی فرآیند NGINX راست کلیک کرده و گزینه End Task را انتخاب کنید.
To send a photo to a .NET Web API, the most common approach is to use multipart/form-data. This allows you to send the photo along with any additional data. Below are the steps to send and receive a photo in your .NET Web API.
When making the request to the API, the client (frontend or another application) should use a multipart/form-data format.
Configure Your API to Handle Large Files (Optional)
To handle large photos, update the Kestrel server limits in your appsettings.json:
appsettings.json:
{
"Kestrel": {
"Limits": {
"MaxRequestBodySize": 52428800 // 50 MB
}
}
}Enable multipart/form-data in Swagger
Swagger does not natively infer multipart/form-data from [FromForm]. You need to use the Swagger File Input in the SwaggerGen configuration.
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "File Upload API", Version = "v1" });
// Enable support for file uploads in Swagger
c.OperationFilter<AddFileUploadOperation>();
});
// Add custom operation filter for file uploads
public class AddFileUploadOperation : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
if (operation.OperationId == "UploadFile")
{
operation.RequestBody = new OpenApiRequestBody
{
Content = new Dictionary<string, OpenApiMediaType>
{
["multipart/form-data"] = new OpenApiMediaType
{
Schema = new OpenApiSchema
{
Type = "object",
Properties = new Dictionary<string, OpenApiSchema>
{
["file"] = new OpenApiSchema
{
Type = "string",
Format = "binary"
},
["description"] = new OpenApiSchema
{
Type = "string"
}
},
Required = new HashSet<string> { "file" }
}
}
}
};
}
}
}Use Swagger annotations to specify that the method accepts a multipart/form-data request:
/// <summary>
/// Upload a file with additional description.
/// </summary>
/// <param name="request">The upload request containing the file and description.</param>
/// <returns>Response with upload details.</returns>
[HttpPost]
[Route("upload")]
[Consumes("multipart/form-data")] // Important for Swagger to recognize file uploads
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task<IActionResult> UploadFile([FromForm] UploadRequest request)
{
// Method body as shown earlier
}#region RegisterUserWithPhoneNumber
[CustomSwagger("این اکشن برای ثبت نام کاربر است.")]
[HttpPost("register-with-phone")]
[Consumes("application/json")]
public async Task<IActionResult> RegisterUserWithPhoneNumber(RegisterUserDTO model, CancellationToken cancellation)
{
if (ModelState.IsValid)
{
try
{
var res = await authService.RegisterUserWithPhoneNumber(model, cancellation);
switch (res)
{
case RegisterUserResult.userExist:
return JsonResponseStatus.SendStatus(JsonResponseStatusType.Warning, "امکان ثبت این شماره تلفن وجود ندارد.", null);
case RegisterUserResult.Error:
return JsonResponseStatus.SendStatus(JsonResponseStatusType.Error, "کلمه عبور باید بیشتر از 5 کاراکتر و همچنین حداقل دارای یک کاراکتر یکتا، حرف کوچک و حرف بزرگ باشد.", null);
case RegisterUserResult.Success:
return JsonResponseStatus.SendStatus(JsonResponseStatusType.Success, "ثبت نام با موفقیت انجام شد", res);
}
}
// در این قسمت اتفاقی که قرار است در صورت لغو عملیات انجام شود صورت میگیرد.
catch (OperationCanceledException)
{
// عملیات لغو شد
return BadRequest(new { success = false, message = "The request was canceled by the client." });
}
catch (Exception)
{
throw;
}
}
logger.LogError("Error Sending Data");
return BadRequest("خطا در ارسال اطلاعات");
}
#endregionاز دستور adduser استفاده کنید تا یک کاربر جدید ایجاد کنید:
sudo adduser usernameاین دستور اطلاعاتی مانند رمز عبور، نام کامل و سایر جزئیات را درخواست میکند. رمز عبور را وارد کنید و اطلاعات دیگر را در صورت نیاز تکمیل کنید.
برای اضافه کردن کاربر به گروه sudo (که به کاربر اجازه اجرای دستورات مدیریتی را میدهد)، از دستور زیر استفاده کنید:
sudo usermod -aG sudo usernameدستور -aG: به معنای اضافه کردن کاربر به گروه (append to group) است.
جایگزین کنید username با نام کاربری ایجاد شده.
برای اطمینان از اینکه کاربر به درستی به گروه sudo اضافه شده است، از دستور زیر استفاده کنید:
groups usernameاین دستور لیستی از گروههایی که کاربر به آنها تعلق دارد را نمایش میدهد. باید sudo در لیست باشد.
برای بررسی اینکه کاربر میتواند از دستورات sudo استفاده کند:
su - usernameیک دستور sudo را اجرا کنید، مانند:
sudo apt updateاگر میخواهید یک کاربر به نام alida ایجاد کنید و به آن دسترسی sudo بدهید:
sudo adduser alida
sudo usermod -aG sudo alida
groups alidaمیتوانید از روشهای زیر استفاده کنید. این تغییر بر نام میزبان سیستم تأثیر میگذارد، که در هنگام استفاده از شبکه یا نمایش در ترمینال مهم است.
hostnameبرای تغییر نام میزبان موقتاً (تا زمان ریاستارت بعدی سیستم)، از دستور زیر استفاده کنید:
sudo hostnamectl set-hostname new-hostnameبرای نمایش اطلاعات IP
ip aبرای چک کردن وضعیت فایروال
sudo ufw statusبرای نصب پکیج
sudo apt-get install PackageNameip anano /etc/netplan/00-installer-config.yaml# This is the network config written by 'subiquity'
network:
ethernets:
eth0:
dhcp4: false
addresses:
- 172.17.61.9/20
eth1:
dhcp4: true
version: 2
renderer: networkd
sudo docker run -d --restart always --name container-name -p 8080:8080 image-namenano /etc/resolv.conf# Generated by NetworkManager
nameserver 127.0.0.53
options edns0 trust-ad
search domain.com
nameserver 172.30.0.61
nameserver 172.30.0.51
nameserver 172.30.0.62
# NOTE: the libc resolver may not support more than 3 nameservers.
# The nameservers listed below may not be recognized.
nameserver 172.30.0.53keytool -genkey -v -keystore {appName}.keystore -alias {keyName} -keyalg RSA -keysize 2048 -validity 10000<TargetFramework Condition="'$(Configuration)' == 'Release'">net9.0-android</TargetFramework>
<AndroidKeyStore>True</AndroidKeyStore>
<AndroidSigningKeyStore>{appName}.keystore</AndroidSigningKeyStore>
<AndroidSigningKeyAlias>{keyName}</AndroidSigningKeyAlias>
<AndroidSigningKeyPass>{P@ssw0rd}</AndroidSigningKeyPass>
<AndroidSigningStorePass>{P@ssw0rd}</AndroidSigningStorePass> dotnet publish -f net9.0-android -c Release// Configure the HTTP request pipeline.
app.UseWhen(context => !context.Request.Path.StartsWithSegments("/_framework"), appBuilder =>
{
appBuilder.UseResponseCompression();
});یکی از راه حل های خطای زیر برای اتصال به دیتابیش در SQL Server Management
TITLE: Connect to Server
------------------------------
Cannot connect to ..
------------------------------
ADDITIONAL INFORMATION:
A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server) (Microsoft SQL Server, Error: 2)
For help, click: https://docs.microsoft.com/sql/relational-databases/errors-events/mssqlserver-2-database-engine-error
------------------------------
The system cannot find the file specified
------------------------------
BUTTONS:
OK
------------------------------
اجرا دستور زیر در win+r یا تایپ کلمه run در search ویندوز:
mmcSave a link to SQL Server Configuration Manager for another computer On the Start menu, select Run.
- In the Open box, type mmc -a (type mmc /32 -a on a 64-bit computer) to open the Microsoft Management Console in author mode.
- On the File menu, select Add/Remove Snap-in.
- In the Add/Remove Snap-in window, select Add.
- In the Add Standalone Snap-in window, select Computer Management and then select Add.
- In the Computer Management window, select Another computer, type the name of the remote computer you wish to manage, and then select Finish.
- In the Add Standalone Snap-in window, select Close.
- In the Add/Remove Snap-in window, select OK.
- Expand Computer Management (), and Services and Applications.
- Right-click SQL Server Configuration Manager, and then select New Window from here.
- On the Window menu, select Console Root, to switch back to the first window, and delete the window.
- On the File menu, select Save As, and save the file in the desired folder, with an appropriate name with the .msc file extension. Close the Microsoft Management Console.
- To open SQL Server Configuration Manager on the target computer, double-click the file. If desired, save a link to the file on the desktop or in the Start menu.
با این کار به صورت Local به دیتابیس دسترسی دارید...
نمونه محتوا فایل برنامه Inno
[Setup]
AppName=YourAppName
AppVersion=1.0.0
DefaultDirName={localappdata}\Programs\YourAppName
DefaultGroupName=Your App Name
OutputBaseFilename=YourAppNameNasb
Compression=lzma2
SolidCompression=yes
OutputDir="D:\Username\YourAppNameNasb\Nasb"
[Files]
Source: "D:\Username\YourAppNameSetup\Release\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs
[Icons]
Name: "{group}\Task Man"; Filename: "{app}\YourAppName.exe"
Name: "{commondesktop}\YourApp Name"; Filename: "{app}\YourAppName.exe"; Tasks: desktopicon
[Tasks]
Name: "desktopicon"; Description: "Create a &desktop icon"; GroupDescription: "Additional icons:"
Name: "autostart"; Description: "Start Task Man automatically with Windows"; GroupDescription: "Startup options:"
[Registry]
; Adds app to Windows startup if autostart is selected
Root: HKCU; Subkey: "Software\Microsoft\Windows\CurrentVersion\Run"; \
ValueType: string; ValueName: "YourAppName"; \
ValueData: """{app}\YourAppName.exe"""; Flags: uninsdeletevalue; Tasks: autostart
و توضیحاتی درباره برنامه Inno
- چند عبارت با grep -E (Extended regex):
tail -f /var/log/syslog | grep -E "ERROR|WARNING|CRITICAL"فقط لاگهایی را نمایش میدهد که یکی از این کلمات را دارند: ERROR یا WARNING یا CRITICAL
- استفاده از grep -i برای غیرحساس بودن به حروف بزرگ/کوچک:
tail -f /var/log/syslog | grep -iE "error|fail|timeout"- برجسته کردن نتایج با رنگ (برای خوانایی بهتر):
tail -f /var/log/syslog | grep --color=always -E "ERROR|FAIL|CRITICAL":: مطمئن شو ریموت درست ست شده
git remote set-url origin route-addressgit fetch origin:: برنچ api را مستقیماً از روی origin/api بساز (با tracking خودکار)
git checkout -b api origin/api:: Pull امن (فقط fast-forward)
git pull --ff-onlygrep "error" logfile.txt🔹 تمام خطهایی که شامل واژه error هست رو در فایل نشون میده.
grep -i "error" logfile.txt🔹 هم Error، هم ERROR و هم error رو پیدا میکنه.
grep -n "error" logfile.txt🔹 شماره خط کنار نتیجه چاپ میشه.
grep -c "error" logfile.txt🔹 فقط تعداد خطهایی که شامل error هستن نمایش داده میشن.
grep -o "error" logfile.txt🔹 به جای کل خط، فقط خود واژهی error رو نمایش میده.
grep -E "error|warning" logfile.txt🔹 تمام خطهایی که شامل error یا warning هستند نمایش داده میشه.
grep -v "error" logfile.txt🔹 همهی خطهایی که کلمهی error ندارن نمایش داده میشه.
grep -o "error" logfile.txt | wc -l- قبل از Match
grep -B 2 "error" logfile.txt- بعد از Match
grep -A 2 "error" logfile.txt- قبل و بعد
grep -C 2 "error" logfile.txtgrep "error" /var/log/*.loggrep -l "error" /var/log/*.loggrep -H "error" logfile.txtgrep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' logfile.txt🔹 تمام IP های موجود در فایل استخراج میشه.
tail -f logfile.txt | grep "error"| گزینه | توضیح |
|---|---|
-i |
حساس نبودن به بزرگی/کوچکی حروف |
-n |
نمایش شماره خط |
-c |
شمارش تعداد خطهای Match شده |
-o |
فقط نمایش بخش Match شده |
-v |
نمایش خطوطی که شامل الگو نیستند |
-E |
فعالسازی Regex پیشرفته |
-A n |
n خط بعد از Match |
-B n |
n خط قبل از Match |
-C n |
n خط قبل و بعد |
این راهنما مراحل ساخت و مصرف داخلی یک پکیج NuGet را تا مرحله استفاده لوکال پوشش میدهد.
برای اینکه خروجی قابلانتشار بسازیم، متادیتای پکیج را در فایل پروژه اضافه کن:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<!-- هویت پکیج -->
<PackageId>PackLib</PackageId>
<Version>1.0.0</Version> <!-- یا PackageVersion -->
<!-- اطلاعات نمایشی -->
<Authors>Ali</Authors>
<Company>Com</Company>
<Description>Custom NuGet Package</Description>
<PackageTags>utilities;dotnet</PackageTags>
<!-- اختیاری ولی توصیهشده -->
<RepositoryUrl>https://github.com/YourOrg/YourRepo</RepositoryUrl>
<PackageProjectUrl>https://github.com/YourOrg/YourRepo</PackageProjectUrl>
<PackageLicenseExpression>MIT</PackageLicenseExpression> <!-- یا PackageLicenseFile -->
<RepositoryType>git</RepositoryType>
<!-- اگر XML docs میخواهی -->
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>
</Project>نکات مهم:
-
مهم: Version را با سیاست نسخهبندی (Major.Minor.Patch) جلو ببر.
-
اگر چند فریمورک را هدف میگیری:
<TargetFrameworks>net8.0;net6.0</TargetFrameworks> -
اگر فایلهای non-code (مثل
.json,.config) باید داخل پکیج باشند، آنها را باContentوPack="true"علامتگذاری کن:<ItemGroup> <Content Include="content\**\*.*" Pack="true" PackagePath="contentFiles\any\any\" /> </ItemGroup>
داخل ریشهی پروژه اجرا کن:
dotnet pack -c Release -o ./nupkgs-
خروجی
.nupkgدر مسیر./nupkgsقرار میگیرد (مثلاًPackLib.1.0.0.nupkg). -
اگر قبلاً Build کردهای و فقط پکیج میخواهی:
dotnet pack --no-build -c Release -o ./nupkgs
گزینههای مفید (اختیاری):
-
نکته: Symbols + SourceLink (بهدرد دیباگ میخورد):
dotnet pack -c Release -o ./nupkgs ^ -p:IncludeSymbols=true -p:SymbolPackageFormat=snupkg -p:IncludeSource=true
-
مهم: Override نسخه از خط فرمان:
dotnet pack -c Release -o ./nupkgs -p:PackageVersion=1.0.1
تأیید خروجی:
- بررسی کن فایلهای
*.nupkg(و در صورت فعالبودن،*.snupkg) در پوشهی./nupkgsساخته شده باشند. - میتوانی محتویات پکیج را با تغییر پسوند به
.zipو بازکردن آن بررسی کنی.
این روش سریعترین راه برای تست پکیج در همان ماشین است.
- مسیر خروجی پکیج را به عنوان سورس اضافه کن:
dotnet nuget add source ./nupkgs -n LocalFeed- در پروژهٔ مصرفکننده، پکیج را اضافه کن:
dotnet add package PackLib --version 1.0.0 --source LocalFeed- در صورت نیاز، سورسهای فعلی را ببین:
dotnet nuget list sourceنکته: اگر نمیخواهی سورس اضافه کنی، میتوانی مستقیماً به مسیر اشاره کنی:
dotnet add package PackLib --version 1.0.0 --source ./nupkgs
اگر میخواهی کل تیم به یک پوشهٔ مشترک روی شبکه دسترسی داشته باشند، مسیر شبکه را به NuGet.Config اضافه کن:
نمونه NuGet.Config (کاربر ویندوز):
%AppData%\NuGet\NuGet.Config
افزودن سورس پوشهٔ شبکه (مثال):
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="LocalFeed" value="\\fileserver\NuGetFeed" />
</packageSources>
</configuration>سپس فقط کافی است در پروژهٔ مصرفکننده بگویی:
dotnet add package PackLib -v 1.0.0توجه: اگر در تنظیمات عمومی ریپوتان سورسهای دیگری را غیرفعال کردهاید (مثل
nuget.org)، مطمئن شوید سورس LocalFeed فعال است و دسترسی به مسیر شبکه برقرار باشد.
-
پکیج پیدا نمیشود: نسخهی دقیق (
version--) را چک کن؛ همچنینdotnet nuget list sourceرا بزن تا مطمئن شوی سورس درست اضافه شده و فعال است. -
کَش NuGet: گاهی پاککردن کش کمک میکند:
dotnet nuget locals all --clear
-
چند نسخه نصب شده: اگر نسخهٔ دیگری از پکیج نصب است، با
version--دقیق نصب کن یا نسخهٔ قبلی را حذف/آپدیت کن.
این مستند توضیح میدهد که تگهای <NoWarn> و <NuGetAuditMode> در
فایلهای .csproj چه کاربردی دارند و چگونه میتوان هشدارها را در سطح
پروژه یا فایل مدیریت کرد.
این بخش در فایل .csproj برای خاموش کردن هشدارهای مشخص در هنگام
Build/Compile استفاده میشود.
<PropertyGroup>
<NoWarn>CS0168,CS1998,BL9993,CS0649,CS0436,0436</NoWarn>
</PropertyGroup>| کد هشدار | توضیح | چرا خاموش میشود؟ |
|---|---|---|
| CS0168 | متغیر تعریف شده ولی استفاده نشده. | در حالت تست یا دیباگ ممکن است متغیری عمداً تعریف شود. |
| CS1998 | متد async است ولی await ندارد. | برای هماهنگی با امضای متد یا interface لازم است. |
| BL9993 | هشدار Blazor (استفادهی اشتباه از attribute). | گاهی false positive است. |
| CS0649 | یک فیلد هرگز مقداردهی نشده. | معمولاً برای DI یا Reflection استفاده میشود. |
| CS0436 | نوعی هم در اسمبلی جاری و هم در reference وجود دارد. | در پروژههای بزرگ یا shared libraries رایج است. |
| 0436 | همان CS0436 ولی بدون پیشوند. | احتمالاً دوباره اضافه شده است. |
این تگ مربوط به بررسی امنیتی پکیجهای NuGet است.
<PropertyGroup>
<NuGetAuditMode>direct</NuGetAuditMode>
</PropertyGroup>- direct → فقط وابستگیهای مستقیم بررسی میشوند.\
- all → وابستگیهای مستقیم و غیرمستقیم (transitive) بررسی میشوند.
این قابلیت برای امنیت و آسیبپذیریها استفاده میشود.
گاهی لازم است هشدار فقط در یک فایل یا یک متد خاص خاموش شود.
#pragma warning disable CS0168, CS1998
// کدهای این بخش هشدار نمیدهند
#pragma warning restore CS0168, CS1998int unusedVar; // CS0168 هشدار نادیده گرفته میشود
#pragma warning disable CS0168
int anotherUnusedVar;
#pragma warning restore CS0168<PropertyGroup>
<NoWarn>$(NoWarn);CS0168</NoWarn>
</PropertyGroup>#pragma warning disable CS1998
public async Task MethodAsync()
{
// این متد async است ولی await ندارد
Console.WriteLine("Hello World");
}
#pragma warning restore CS1998- از
<NoWarn>برای خاموش کردن هشدارهای پروژه استفاده کنید. - از
<NuGetAuditMode>برای کنترل سطح بررسی امنیتی پکیجها استفاده کنید. - از
#pragma warning disable/restoreبرای خاموش کردن هشدارها در سطح فایل یا متد استفاده کنید. - بهتر است هشدارها فقط در صورت لزوم خاموش شوند، چون ممکن است خطاهای مهم را پنهان کنند.