We have a SharePoint timer job that is deployed by WSP file. The job is installed by a SharePoint feature and its dll is placed on GAC.
Every other SharePoint customization is deploying by another WSP file which is placed on SharePoint Site's bin folder, and not on GAC.
The SharePoint timer job is executed by the service Windows SharePoint Services Timer (OWSTIMER.EXE) and hasn't any http or SharePoint context.
If the job have any external reference we have to put every referenced dll on the GAC too. However, we can't do it because the server polices don't allow GAC deployment of anything else beside the job dll...
Then, our team manually copy and paste the code that would be referenced and put it inside of the job project and build a giant unique dll. Such duplication process have caused all sort of troubles because of sometimes the code became desynchronized on inside the job. Nevertheless , duplication never is a beautiful thing to do and we know we are going straight to hell when we die because of it.
Is it possible to deploy the job without deploying its references on the gac?
Or is it possible to merge the referenced dlls inside a unique dll?
Or if everything else fails, it is possible to build the project so the referenced code is copied on the compilation time?
Thank you on advanced.
The real problem is your server admins blanket ban on GAC deployment for anything other than the job DLL. Nothing like a policy without considering the implications ;)
The band aid to this is ILMerge.
ILMerge is a utility that can be used
to merge multiple .NET assemblies into
a single assembly. ILMerge takes a set
of input assemblies and merges them
into one target assembly.
This will allow you to merge your job assembly and all the dependant assemblies into one super job assembly for deployment - much better than manually copy and pasting code. Plus you can do it in the postbuild steps so its all built into your build process.
Why can't referenced dll be put in the bin directory ? It can certainly be.
Related
Using TFS 2010 and I have a build project consisting of 2 solutions. One is a MVC solution with web pages the other is a solution containing multiple projects. These are various WFC services. I have added the criteria to publish each project in both solutions.
If I build either of them from VS - I get the zip files created.
If I use msbuild from a command prompt and build the WFC solution - I get the zip files.
Same for the MVC.
I then have a build project that builds both solutions, and I have as parameters
/p:DeployOnBuild=true;DeployTarget=Package
When I submit that build - it completes. But in the "_PublishedWebsites" folder I only get a package for the MVC project.
I've tried a LOT of variations but can't get the WFC solution to create the packages for the projects. I even named the pubxml files the same in each WFC project and tried passing that in as another parameter but the same results - MVC is correct; nothing for the WFC.
Even tried changes to Debug|AnyCPU versus Debug|Any CPU (space added).
I am thinking I have some little thing off that is biting me - but I can't find it.
Appreciate any assistance!
The WCF projects need to have been created as Web Applications and not just Websites. The default behavior you want is only available in Web Application.
There is walkthough on how to do the conversion on MSDN (http://msdn.microsoft.com/en-us/library/aa983476(v=vs.90).aspx). I tend to modify the documentation to be an in place upgrade by creating a blank web application and copying the project file over the top of the existing location.
You can then open that new project in VS (giving you two views of the same thing) and then adding the hidden files. Once working you can then delete the WebSite project and you will be left with thebWeb Application that will output to _PublishedWebsites.
I have a larger solution that I desire to distribute via ClickOnce. It consists of one main shell executable that directly references only a small subsection of libraries and processes that constitute the solution.
The solution consists of a few other processes and several libraries (some C++). I need to be able to include all of these libraries and processes in one ClickOnce distribution for both local builds and TFS server builds.
I cannot reference every other library and process form the shell project. And I do not wish to push these files into a MSI to be treated as a prerequisite as it would defeat the purpose of using ClickOnce to distribute/update the product.
What is the correct method to incorporate all of our necessary files/projects into a single ClickOnce distribution?
The IDE won't detect native DLLs as dependencies when publishing, but you can run the SDK tools directly to include them manually in your ClickOnce distribution. You can either use mage.exe in your post-build script or run MageUI.exe to have a wizard to guide you through the package generation.
Suggested reading:
Walkthrough: Manually Deploying a ClickOnce Application
Understanding Dependencies of a Visual C++ Application
There is an alternative to Visual Studio for this kind of situation. You could try using Mage, but it can be a little tricky to use. My company wrote an alternative called ClickOnceMore.
ClickOnceMore is a ClickOnce build tool for when you don't want or can't use Visual Studio to do ClickOnce builds.
There is a specific page on the UI for including files (using rules to include anything from a single file to an entire directory trees) so you should be able to do exactly what you need with it.
This is what I have done in a similar situation. I use TFS at work, so convert the terms to whatever you may use (or not use) for source control.
I have a main workspace that I use for all development of my application, I keep this workspace pristine.
I then created another workspace with a proper name (ex: solution-deploy) and in this workspace I do the following:
Get latest and merge everything from source-control into the deployment workspace
I build a Release build of my application
I r-click on the root (I put them in the root, because I need to access them from there, put them in whatever folder you want) project folder for my deployment project and select "Add -> Existing Item"
I browse in the file selector to the Release directory of the assemblies I want to add to my deployment package, select them, then I use the arrow next to the Add button and drop down to "Add As Link", do this for all of the assemblies you want to add and place them wherever you want them to be organized in your deployment
In the Solution Explorer, select the added assemblies and in the Properties window set the Build Action to "Content", this should be all you have to do, but others have had to also set the "Copy to Output Directory" to "Copy Always", I don't do that
Run a Release Build
Go to the Properties view for your deployment Project
Go to the Publish Tab and Click on the Application Files button
Your files should all be available and added to the Deployment
Set up your ClickOnce settings however you need them to be
Publish your ClickOnce package
Your published package should contain all of the assemblies you need now.
Keep your separate Deployment workspace set up this way and never check it in. Do your work in your development workspace. Whenever a new deployment is needed, open your solution in your Deployment workspace and get the latest code, build, then publish.
When I publish a ClickOnce application, one of the references that is included in one of my projects is missing.
If I go to my project's Properties -> Application Files, this missing reference is not even listed here.
My bin/Release folder has an .exe.manifest file, and I noticed it that it is also missing from here.
However, when I build the project, the DLL is in fact copied to my bin/Release folder.
How can I ensure it also deploys this required dependency?
I finally found a solution for this problem and I hope it will solve your problem to.
In my case, I'm editing an old application at work which have multiple projects, but the main project and it's back end project are the most important here.
The back end is added in the References section of the main project.
In the back end, a third party dll was imported, but this dll requires 2 other dlls.
So those 3 dlls were added in the References section of the back end project.
At that point, one of the 2 other dlls was not showing in the Application Files section for ClickOnce.
I've come up with a couple of ways of fixing it, but the most elegant one was to add this dll in the Reference section of the main project.
As stated in How to: Specify Which Files Are Published by ClickOnce, change the Copy Local property value on the reference to True.
References to assemblies (.dll files) are designated as follows when you add the reference: If Copy Local is False, it is marked by default as a prerequisite assembly (Prerequisite (Auto)) that must be present in the GAC before the application is installed. If Copy Local is True, the assembly is marked by default as an application assembly (Include (Auto)) and will be copied into the application folder at installation. A COM reference will appear in the Application Files dialog box (as an .ocx file) only if its Isolated property is set to True. By default, it will be included.
I know is this an old question, but for anybody having similar issues. I think this is a cleaner way around the problem.
I had a similar issue and everything I did to get ClickOnce to deploy with the offending .dll failed.
Eventually, I had to deploy manually.
See walk-through here.
That worked for perfectly for me. But, for the life of me, I still wonder why that process can't be added to VS (I'm using 2017 community).
I recently upgraded my SharePoint development machine to VSeWSS 1.3 and have noticed a behavior that I didn't think existed before. I have two custom web parts that use several common assemblies, and both will live in the same site. I'm trying to create a third 'common' web part that copies these files to the Bin folder and adds safe control entries to web.config so I can remove one of the web part solutions, if needed, without crippling the other one.
With the prior version of VSeWSS I thought it only included assemblies in the manifest if you included them in the given Visual Studio project. I've removed the common assemblies from the two web part projects, but entries for them still end up in their solution manifests. Obviously the extensions are looking at the references for the web part and going by that, even if the file are in another directory alltogether.
Is there any way to tell the extensions to not add assembly entries to the manifest even if they are referenced in the project? Or is there a better way to separate the common code from the web parts that use it?
Yes you could prevent VSeWSS from deploying assemblies. Just select the assembly in the list of referenced assemblies in you VS project and look at its properties. There you can find the option "LocalCopy", which you have set to false to prevent the assembly from being deployed.
I have multiple projects/wsp solutions for my different Sharepoint webparts and event receivers. This is fine for development, however I would like to merge the resulting .wsp files into a single one for production deployment.
Is there a way to do so? I am using vsewss 1.2 only.
This is going to be painful, but to really do this correctly for production pushes you should drop vsewss 1.2, re-organize your projects inside of Visual Studio and use WSPBuilder.
WSPBuilder is great because it takes a lot of the manual work out of creating manifest, ddf and compiling the CAB.
You are going to have to do a lot of the work that vsewss is doing in the background your self. there is a artical on MSDN about the basics on creating a WSP Creating a Solution Package in Windows SharePoint Services 3.0
A WSP is a cab file that contains a manifest.xml and a file structure, it is imortant that you place files in the right location in the WSP so they are deployed to the right location in SharePoint.
I agree with JD
This is going to be painful, but to
really do this correctly for
production pushes you should drop
vsewss 1.2, re-organize your projects
inside of Visual Studio and use
WSPBuilder.
This would be a good time to restructure you code and assembly structure so as to minimise the number of assemblies you need to deploy.
If you have any Web Parts be sure to check that the Feature xml files are all corect as vsewss preparses and does text replacment befor generating its WSP files.
It commanly stores a guid in the file where a full assembly name is requierd.
If you are going to be doing a lot of SharePoint dev work it is probly worth spending a bit of time learning how the manafest.xml and rest of the WSP packages work.
I haven't seen a tool which does this, but it shouldn't be hard to create:
Unzip the wsp packages (They're just
cab files with an odd extension)
Merge the directory structures
Merge the manifest.xml files
Zip the combined package
There is an advantage to not having all your code in a single WSP.. you can do partial deployments and you don't have all your code in a single gigantic Visual Studio Solution.
Why don't you script all WSP deployments in 1 script file? It seems a far more transparent solution than fiddling with the WSP itself.