NSIS - How to include all folders from source to Installer - windows

I have an application which consists one .exe, many .dlls and a few folders.
I use NSIS to create an installer. It works but when I install the software, I don't see all the folders inside my application.
What do I have to do to bundle all the folders within my application into the installer?
This is the code I set the data source at this time:
File "c:\MyProject\MyApp\*"

The documentation tells us that the /r argument of the File command includes all sub folders and files. So you would use something like this:
File /r "c:\MyProject\MyApp\*"
The relevant section of the documentation can be found here:
http://nsis.sourceforge.net/Docs/Chapter4.html#file

Related

Best Way To Copy All Projects EXE And DLL Files In A Solution To One Common Folder?

I have a C# Visual Studio solution with about 15 projects. When I build the solution I want all DLL and EXE files for each project to go to a common folder (called Deploy).
The way I was thinking about doing it was, for each project's Post-build Event Command Line section put the following commands:
IF NOT EXIST $(SolutionDir)Deploy (
'If directory does not exist, create it
MKDIR $(SolutionDir)Deploy
) ELSE (
'Delete directory to make sure it's "clean"
RMDIR /F /S /Q $(SolutionDir)Deploy
MKDIR $(SolutionDir)Deploy
)
'Copy executable and required DLLs to Deploy directory
COPY /Y $(TargetPath) $(SolutionDir)Deploy
COPY /Y $(TargetDir)*.dll $(SolutionDir)Deploy
The problem with doing it this way, however, is I have 15 projects and would have put this in each individual project's post build event section and also, every time I add a new project, I would have to remember to do the same for it.
I checked the solution file properties and did not see a way to set a solution-wide post build event to copy all the files so I did a few Google searches.
One page said to use a C++ Makefile project. I added this type of project to my solution and clicked on the project properties page and found that there is a section under Configuration Properties->NMake with the following:
Build Command Line
Rebuild All Command Line
Clean Command Line
Using the Makefile project's Command Line option poses a similar problem to above. Many different commands to copy each of my 15 project's output files such as:
COPY /Y $(SolutionDir)Project1\bin\$(ConfigurationName)\*.exe $(SolutionDir)Deploy
COPY /Y $(SolutionDir)Project2\bin\$(ConfigurationName)\*.exe $(SolutionDir)Deploy
...
COPY /Y $(SolutionDir)Project15\bin\$(ConfigurationName)\*.exe $(SolutionDir)Deploy
There is another apparent problem with doing it this way. As you can see I took advantage of the $(SolutionDir) and $(ConfigurationName) macros but I had to hard-code each project name.
I didn't see any macros like $(AllProjects), $(AllProjectDirs), etc.
Also, it appears that command line commands for Makefile projects are for building, not post-build events, so I gave up on this idea altogether.
I then tried using a Visual Studio Installer project. After adding the project to my solution I right-clicked the project and saw that there was an Add->Project Output... option. This brought up a dialog allowing me to add one of my other project's Primary Output. I repeated this for each of my other projects and rebuilt.
What resulted was an .MSI file in the output folder. I then opened installer project properties and changed the Package files option to As loose uncompressed files and rebuilt. The output folder now contained all my project's EXE and DLL files!
Most people would be satisfied at this point and move on but I am the kind of person who likes to find the best way to do things.
There was one thing I didn't like about using the installer project option, the fact that, besides copying the files from all my projects, it also created an MSI file (which I don't need) and I didn't see any option tell it not to create one.
Can anyone recommend a another/better way to accomplish my goal of copying all project output files to a single folder?
Thank you.
P.S. I was thinking I could just make a batch file to search and copy all the EXE and DLL files to the Deploy folder but I would have to run the batch file outside of the Visual Studio IDE and also hard-code the configuration folder (Debug or Deploy).
Can't you just change the Output Directory of the C++ projects? See How to: Change the Build Output Directory.
On the menu bar, choose Project, Properties.
Expand the Configuration Properties node, and choose General.
Change the Output Directory value to the new output directory.
If you want both options, you can also create multiple configurations for your VS projects and solutions, similar to the standard "Debug" and "Release" ones. Create a new configuration from one of the existing ones, then change the output directory and save. Now you can just switch the configuration at the solution level to build into another directory. See this link for detailed steps:
How to: Create and Edit Configurations

Include all files from a folder in MSI

How can I to include all files from source folder and deploy them into a target folder during installation. I have multiple images in a folder and i want all of them to be included in msi automatically rather than including all of them separately using <File> element.
You need to Read about HEAT in the wix installer tutorial,
http://wix.tramontana.co.hu/
"%WIX%\bin\heat.exe" dir "$(SolutionDir)bin\Release -out Release.wxs"
this is the type of pre-build event you will need to define in order to harvest a directory.

Include folder and files in a console app on build

I am currently creating a console application which is reading from a folder which contains xml files, like so:
/Templates/Create.xml
/Template/Update.xml
But when I debug the application it is looking for the files in /bin/Debug/Templates because I use: System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
So it is doing exactly what i want it to ..but is there any way to get Visual Studio to copy the folder and files automatically to the Debug/Release folder?
At the moment I have to keep the two folders updated.
I have done this before in a Windows application, but I can't seem to figure it out in a console
SOLUTION:
I added the following code in Pre-build:
XCOPY "$(ProjectDir)Templates" "$(TargetDir)Templates" /R /Y /I /T
..and it works like a charm
In visual studio you can have post build actions. In this you can write command to copy the xml to the Debug/Release folder depending upon your BuildMode.
Update:
In Project Properties you can find this.

Microsoft visual studio 2008 setup project

I have a bunch of files and need to build MSI file /setup.exe file that put them on specific folder and run one file of them that install a win32 service is that possible with micorosoft visual studio 2008 setp project ?
suppossing i have the following files:
file1,
file2
file3
file4
I need to put file1,file,file3 under c:\documents and setting\all users\my directory
and run file4 which install a win32 service while running the setup or the msi is that possilbe ?
Yes, that's all possible. Create a new deployment project and in the File View add the files from your project in the correct places. You may need to mark your files as Content = True in the file properties (from the solution explorer) then I think they'll appear in the dropdown in the file view.
For a windows service, the executable needs to be able to install itself as a service from the command line anyway, so installing it from the MSI is easy as you just need a custom step to call your .exe.
Yes. You can do this with a standard Setup Project. To add custom files and folders, check this link: http://msdn.microsoft.com/en-us/library/x56s4w8x.aspx
For the base "All Users" folder, you will need to specify a Special Folder, specifically the CommonAppDataFolder.
Specifying how to install a Windows Service involves using a special component. I'm not too happy with it, I much prefer Wix.

What's the easiest way to install 100s of files in a Visual Studio setup project

I have a standard c# application that acts as a GUI front end for a an "R" statistics engine. "R" consists of approx 600 files in approx 50 different folders and can be "installed" on a machine through xcopy deployment.
I would like to package up both the R engine and my c# gui into one setup.exe so that the user doesn't need to go and install R first and then my c# application seperately.
I know that I can produce a setup project and then add in the R files one by one but adding all 600 files will be very tedious!
Is there an easier way of doing what I want? Can I add the single R folder and automatically add the subfolders and files to save me adding them in one by one? Or maybe do an unzip procedure in my setup project which will unzip the R engine in one go?
You can simply drag/drop the folder in Windows Explorer into the File System view of your Installer vdproj. All the files and folders in the hierarchy will be added to your setup project.
Tip: If the folders are in SVN or similar source control, delete all the hidden folders before you do this! If you have PowerShell, check out
get-childitem . -include _svn -force -recurse | foreach ($_) {remove-item -recurse -force $_.fullname}
Or you can always use Windows Search to find all hidden directories in the hierarchy and delete them from the Results Window.
I couldn't work out the project file so what I did in the end was to zip up all the files I wanted to deploy, add the zip file to the application and create a custom Installer class to unzip them (using CSharp ziplib)
I think Badjer is most of the way there.
If your 600 files are part of a project and the "Build action" for each of these is set as content you can add all of these by simply:
Going to the setup project
Selecting Add > Project Output
Selecting the project the files belong to from the drop down
Selecting the "Content Files" option from the list below
Clicking OK.
You can check the files will be added to the appropriate place by going to View > File System on the setup project and checking that the content files output is being added to the correct folder.
The files will be added to the install directory in the same hierarchy as they are specified in the project they belong to.
Have a look at the project file. I believe is text based. You might be able to insert the file paths directly there with some copy-paste-replace.
One thing you could try is adding the R files as content in the C# project - then the setup project can just copy them over for you (make sure you configure the setup file to copy content files from your project, not just the primary output).
You can either add the R folders into the project manually, or set up a script to modify the .csproj file (it's just an XML file) - content items are represented by these nodes:
<Content Include="myfile" />

Resources