성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
[정성태] 만드실 수 있습니다. 단지, Unity 엔진 내의 스크립트와 W...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>.NET Core의 dotnet.exe CLI 명령어 확장 방법</h1> <p> 아래와 같은 글이 있군요. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Building a custom dotnet cli tool ; <a target='tab' href='http://dotnetthoughts.net/building-a-custom-dotnet-cli-tool/'>http://dotnetthoughts.net/building-a-custom-dotnet-cli-tool/</a> </pre> <br /> 위의 글대로 실습을 하면서, dotnet.exe CLI 명령어 확장이 어떤 것인지 알아보겠습니다. ^^ (물론, 이 글을 안 보고 간단하게 원문을 보셔도 됩니다.)<br /> <br /> <hr style='width: 50%' /><br /> <br /> "<a target='tab' href='http://dotnetthoughts.net/building-a-custom-dotnet-cli-tool/'>Building a custom dotnet cli tool</a>" 글에서 만든 것과 똑같은 확장을 만들면 재미없으니 ^^ 이 글에서는 닷넷 프로젝트의 "/bin", "/obj" 폴더를 정리해 주는 "clean" 기능을 구현해 보겠습니다.<br /> <br /> 우선, dotnet.exe CLI의 확장 명령어에 대응하는 "Console Application (.NET Core)" 프로젝트를 Visual Studio 2015에서 생성합니다. (또는, Visual Studio Code로 콘솔 프로젝트에 대응하는 구성을 해도 됩니다.)<br /> <br /> 그다음, 기본 생성된 콘솔 프로젝트의 project.json 파일에 다음의 내용들을 추가해 줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > { "version": "1.0.1-*", "title": "BuildClean", "description": "A dotnet CLI tool for cleaning projects.", "authors": [ "stjeong" ], "packOptions": { "projectUrl": "https://github.com/stjeong/BuildClean", "licenseUrl": "https://github.com/stjeong/BuildClean/blob/master/LICENSE" }, "copyright": "Copyright (C) stjeong 2017", "buildOptions": { "debugType": "portable", "emitEntryPoint": true, <span style='color: blue; font-weight: bold'>"outputName": "dotnet-clean"</span> }, "dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.0.0" } }, "frameworks": { "netcoreapp1.0": { "imports": "dnxcore50" } } } </pre> <br /> 이제 "dotnet.exe clean" 명령어 시에 실행될 코드를 Program.cs 파일의 Main 함수에 추가해 줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using System; using System.IO; namespace ConsoleApp1 { public class Program { public static void Main(string[] args) { char separator = Path.DirectorySeparatorChar; foreach (string dirPath in Directory.EnumerateDirectories(Directory.GetCurrentDirectory(), "*.*", SearchOption.AllDirectories)) { if (dirPath.EndsWith(separator + "bin", StringComparison.CurrentCultureIgnoreCase) == true || dirPath.EndsWith(separator + "obj", StringComparison.CurrentCultureIgnoreCase) == true) { try { foreach (string filePath in Directory.GetFiles(dirPath, "*.*", SearchOption.AllDirectories)) { try { File.Delete(filePath); } catch { } } Directory.Delete(dirPath, true); } catch { } } } } } } </pre> <br /> 기능 구현이 끝났으니, 이 프로젝트를 Nuget 패키지로 만들어 NuGet Gallery에 배포해 줍니다. 이에 대한 자세한 방법은 아래의 글에서 한번 설명한 적이 있습니다. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > .NET Core 프로젝트를 NuGet Gallery에 배포하는 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11034'>http://www.sysnet.pe.kr/2/0/11034</a> </pre> <br /> 위의 글에서 설명한 대로, project.json 파일이 있는 폴더에서 "dotnet pack" 명령을 실행한 후 정상적으로 "BuildClean.1.0.1.nupkg" 패키지 파일이 생성된 \src\BuildClean\bin\Debug" 폴더에서 "nuget push"를 실행해서 등록을 완료합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > nuget push BuildClean.1.0.1.nupkg -Source https://www.nuget.org/api/v2/package </pre> <br /> 여기까지는, "dotnet.exe 확장 명령어"를 구현하는 개발자가 해주어야 할 일입니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 이제, NuGet에 올려진 "확장 명령어"를 여러분들의 프로젝트에서 사용하는 방법을 알아보겠습니다.<br /> <br /> 실습을 위한 프로젝트를 하나 만들어야 하는데, 간단하게 이번에도 "Console Application (.NET Core)" 프로젝트를 만듭니다. 그다음 project.json에 다음과 같이 "tools"를 추가해 줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > { "version": "1.0.0-*", "buildOptions": { "emitEntryPoint": true }, "dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.0.0" } }, "frameworks": { "netcoreapp1.0": { "imports": "dnxcore50" } }, <span style='color: blue; font-weight: bold'>"tools": { "BuildClean": "1.0.1" }</span> } </pre> <br /> 이후 "dotnet restore" 명령어를 실행해 주면 다음과 같은 식으로 NuGet 갤러리로부터 BuildClean 바이너리가 로컬 PC에 구성됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\ConsoleApp1\src\ConsoleApp1><span style='color: blue; font-weight: bold'>dotnet restore</span> log : Restoring packages for C:\ConsoleApp1\src\ConsoleApp1\project.json... log : Restoring packages for tool 'BuildClean' in C:\ConsoleApp1\src\ConsoleApp1\project.json... log : Installing BuildClean 1.0.1. log : Writing lock file to disk. Path: C:\ConsoleApp1\src\ConsoleApp1\project.lock.json log : C:\ConsoleApp1\src\ConsoleApp1\project.json log : Restore completed in 3720ms. C:\ConsoleApp1\src\ConsoleApp1> </pre> <br /> 이제부터는, "tools"에 "BuildClean" 항목을 포함한 프로젝트라면 다음과 같이 "clean" 명령을 내리는 것이 가능합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > dotnet clean </pre> <br /> 테스트를 위해 ConsoleApp1 프로젝트를 빌드해 보고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\ConsoleApp1\src\ConsoleApp1><span style='color: blue; font-weight: bold'>dotnet build</span> Project ConsoleApp1 (.NETCoreApp,Version=v1.0) will be compiled because expected outputs are missing Compiling ConsoleApp1 for .NETCoreApp,Version=v1.0 Compilation succeeded. 0 Warning(s) 0 Error(s) Time elapsed 00:00:01.0991770 </pre> <br /> 다시 "dotnet clean" 명령어를 내려 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\ConsoleApp1\src\ConsoleApp1><span style='color: blue; font-weight: bold'>dotnet clean</span> </pre> <br /> 이전 "dotnet build" 명령어로 생성되었던 "/bin", "/obj" 폴더가 삭제된 것을 알 수 있습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 원문으로 돌아가서 "<a target='tab' href='http://dotnetthoughts.net/building-a-custom-dotnet-cli-tool/'>Building a custom dotnet cli tool</a>" 글의 작성자가 만든 "Imageoptimize"를 한번 볼까요? ^^<br /> <br /> 이 도구를 여러분의 "project.json"에 포함시키면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > "tools": { "BundlerMinifier.Core": "2.0.238", "Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview2-final", "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final", <span style='color: blue; font-weight: bold'>"Imageoptimize": "1.0.0"</span> } </pre> <br /> 이후부터 "dotnet imgopt"라는 명령어를 실행할 수 있습니다. 이 명령어를 내리면 여러분들의 프로젝트 하위에 있는 모든 PNG 파일의 화질을 낮춰서(즉, 파일 용량을 줄여) 저장해 줍니다.<br /> <br /> 이렇게 "dotnet.exe 확장 명령어"를 만들어 두어 좋은 점이 또 하나 있다면, "빌드 스크립트" 과정에 명시해 이 과정을 자동화할 수 있다는 것입니다. 즉, 다음과 같이 "project.json" 파일에 "scripts"로 등록시켜 두면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > "scripts": { "precompile": [ "dotnet imgopt" ], } </pre> <br /> "dotnet build" 명령어를 내렸을 때, 자동으로 컴파일 이전 단계에서 "dotnet imgopt" 명령을 실행해 이미지 크기를 줄여주는 것입니다. 따라서, 활용 방안에 따라 여러분들의 귀찮은 pre/post 작업들을 자동화하는 것이 가능합니다.<br /> <br /> 물론, 기존의 Visual Studio에서도 빌드 이벤트를 걸어서 이런저런 작업들을 할 수 있었지만 NuGet 갤러리를 활용한 "빌드 작업" 바이너리를 모두 공유할 수 있도록 체계화시켰다는 점에서 한 발짝 더 진보한 셈이 됩니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
9499
(왼쪽의 숫자를 입력해야 합니다.)